PowerShell解析西里尔字母т报错的原因与解决办法
问题触发原因
- 该问题本质是代码文件编码与PowerShell解析器默认读取编码不匹配导致的,和西里尔字符
т本身的语义无关。 - Windows平台默认的PowerShell 5.1版本解析
.ps1文件时,默认使用系统区域对应的ANSI编码读取文件。如果你的代码文件实际使用的编码(比如无BOM的UTF-8、其他地区的单字节编码)和系统默认ANSI编码不一致,部分特殊字符的字节序列会被解析器误判:т字符的对应编码字节恰好触发了解析逻辑的判定冲突,被误认为是字符串的一部分,才会抛出缺少字符串终止符、表达式缺少右括号这类报错,之前的а、б字符编码未触发该冲突,所以看起来运行正常。
解决方案与替代方案
- 最优方案:将代码文件保存为带BOM的UTF-8编码
所有版本的PowerShell对带BOM的UTF-8编码兼容性最好,不受系统默认编码影响,可以正确识别全部Unicode字符。你只需要把代码文件另存为UTF-8 with BOM格式,原有代码不需要任何修改即可正常运行。 - 不修改文件编码的替代方案:使用Unicode字符转义写法
可以用PowerShell内置的字符转义语法直接指定字符的Unicode编码,т对应的Unicode码为U+0442,转义写法为$([char]0x0442),修改后的数组定义如下:
该写法不依赖文件编码,任意场景下都不会触发解析错误。$mapping = ('а', 'б', $([char]0x0442)) foreach ($i in $mapping) { Write-Host $i } - PowerShell 7+版本适配方案
如果你使用的是跨平台的PowerShell 7及以上版本,其默认使用UTF-8编码解析文件,只需要将代码文件保存为无BOM的UTF-8格式即可正常运行,无需额外操作。 - 临时适配方案:修改当前会话的默认编码
如果你不想修改文件或代码内容,可以在运行脚本前执行以下命令,临时修改当前PowerShell会话的默认编码规则,之后再运行脚本即可正常解析:$PSDefaultParameterValues['*:Encoding'] = 'UTF-8' [Console]::InputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
内容的提问来源于stack exchange,提问作者gargoylebident
相关产品推荐
相关产品推荐

