PowerShell不同设备返回UTF-8变量编码结果不一致问题排查
直接返回UTF-8编码变量的输出影响因素及排查项
测试复现代码
$error = "žluťoučký kůň" return $error
测试场景说明
- 对比环境:Windows Server 2016、Windows 10
- 基线对齐项:两套环境默认编码设置、PowerShell版本完全一致
- 异常现象:Windows Server 2016运行上述代码返回乱码,Windows 10端显示正常
- 部署要求:需批量部署到大量服务器,需保证编码逻辑正常运行,明确待排查配置项
运行效果对比
- Windows Server端乱码效果:

- Windows 10端正常显示效果:

核心影响因素&排查配置项
即使PowerShell版本、系统表面编码设置一致,以下配置项差异都会导致UTF-8输出乱码,按优先级排查:
- 脚本文件存储编码:Windows PowerShell(5.1及以下版本)默认以系统ANSI编码读取无BOM的脚本文件,必须确认部署的.ps1脚本本身存储为带BOM的UTF-8编码,否则脚本内的UTF-8字符会被按ANSI解析出现乱码,PowerShell 7及以上版本才默认支持无BOM UTF-8脚本读取。
- 控制台活动代码页:在PowerShell中执行
chcp查看当前代码页,正常输出UTF-8内容需要代码页为65001。Windows Server 2016默认控制台代码页为系统对应区域的ANSI代码页(如简体中文环境为936),Windows 10如果开启了UTF-8全球语言支持会自动将代码页设为65001,这是两类环境最常见的差异点。 - PowerShell内置编码变量:检查
$OutputEncoding、[Console]::OutputEncoding两个变量的编码配置,二者需均设置为UTF-8编码对象,可通过以下命令统一配置:
$OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
- 系统区域Unicode配置:打开「控制面板-区域-管理-更改系统区域设置」,确认是否勾选Beta版:使用Unicode UTF-8提供全球语言支持,如果Windows 10端手动开启过该选项、Server 2016未开启,就会出现默认编码行为不一致,Server端开启该选项需要重启系统生效。
- PowerShell配置文件差异:检查两台机器的
$PROFILE配置文件内容,Windows 10端如果安装过Windows Terminal、VS Code PowerShell插件等工具,可能自动写入了编码相关的自定义配置,Server端默认无任何自定义配置,会导致加载后的编码环境不一致。 - 控制台字体配置:确认Windows Server 2016的PowerShell控制台字体是否支持扩展拉丁字符,如果使用了不支持Unicode特殊字符的点阵字体,即使编码配置正确也会显示为方块乱码,建议将控制台字体替换为Consolas、Lucida Console这类支持Unicode字符的字体。
内容的提问来源于stack exchange,提问作者Michal Stoklasa
相关产品推荐
相关产品推荐

