PowerShell已设UTF-8仍输出乱码:项目符号显示异常
解决PowerShell 5.1中项目符号•显示为•的乱码问题
问题根源
你看到的•是UTF-8编码的项目符号•(Unicode U+2022)被错误以Windows-1252编码解码的结果。PowerShell 5.1对UTF-8的支持存在局限性,仅设置$OutputEncoding和[Console]::OutputEncoding无法覆盖所有场景。
分步解决方案
1. 切换控制台代码页为UTF-8
控制台默认代码页(如GBK、Windows-1252)会导致UTF-8字符显示乱码,需手动切换:
chcp 65001 | Out-Null
若要永久生效,将上述命令添加到PowerShell配置文件中:
# 打开配置文件 notepad $PROFILE # 添加一行:chcp 65001 | Out-Null
2. 避免脚本编码导致的字符解析错误
PowerShell 5.1默认仅识别带BOM的UTF-8脚本文件,若脚本是无BOM的UTF-8,直接写入的•会被错误解析。两种解决方式:
- 保存脚本时选择「UTF-8 with BOM」编码;
- 用Unicode转义序列生成项目符号,彻底规避编码问题:
# 生成单个项目符号 $bullet = [char]0x2022 # 生成多个项目符号 $bullets = -join ($bullet * 3)
3. 写入CSV文件的正确编码处理
即使指定-Encoding UTF8,PowerShell 5.1的Export-Csv有时仍会出现编码偏差,建议用.NET类直接写入:
$version = 3 $fullname = "Paul" $result = "$fullname " + (-join ([char]0x2022 * $version)) # 写入UTF-8无BOM文件 [System.IO.File]::WriteAllText("output.csv", $result, [System.Text.Encoding]::UTF8) # 若需要带BOM的UTF-8,直接使用上述命令即可(.NET的UTF8默认带BOM)
4. Visual Studio中运行的适配
确保VS输出窗口编码设置为UTF-8,同时在脚本开头添加chcp 65001 | Out-Null,并使用Unicode转义生成项目符号。
示例代码
chcp 65001 | Out-Null $version = 3 $fullname = "Paul" $bulletString = -join ([char]0x2022 * $version) $result = "$fullname $bulletString" # 控制台输出 Write-Host $result # 写入文件 [System.IO.File]::WriteAllText("output.csv", $result, [System.Text.Encoding]::UTF8)
内容的提问来源于stack exchange,提问作者Paul Williams
相关产品推荐
相关产品推荐

