解决 Codex 调用 PowerShell 读取 UTF-8 文件乱码问题
前言
最近在折腾 Codex 的过程中,遇到了一个让人头秃的小Bug:明明代码逻辑写得没问题,读取文件时却总是显示一堆乱码。
Codex 调用 PowerShell 读取 UTF-8 文件时出现的乱码现象
经过一番排查,发现罪魁祸首竟然是 PowerShell 的默认编码设置。这里就把踩坑经历和解决方案分享给大家,希望能帮到遇到同样问题的朋友。
问题复现
场景很简单:当 Codex 或者其他自动化脚本调用 PowerShell 去读取一个文本文件时,如果这个文件是 UTF-8 编码的,而 PowerShell 默认按照系统区域设置(通常在国内中文环境下是 GB2312)去解码,结果就是“你好”变成了“ä½ å¥½”,代码直接跑飞。
简单来说,就是“车同轨、书同文”没做到位,两边说的不是一套语言体系。
原因分析
PowerShell(特别是旧版本)在处理文件输入输出(I/O)时,如果不显式指定编码,它会非常“智能”地猜测,或者直接使用系统默认的 ANSI 代码页(对于简体中文 Windows 通常是 GBK/GB2312)。
而现在的开发环境为了国际化,绝大多数文本文件、脚本源码都默认保存为 UTF-8(特别是带 BOM 或不带 BOM 的格式)。于是,冲突就发生了:
- 文件真实格式:UTF-8
- PowerShell 理解格式:GB2312
- 结果:乱码
解决方案
针对这个问题,这里有几种不同层级的解决思路,你可以根据实际使用场景选择最合适的一种。
1. 修改 PowerShell 读取命令(推荐)
如果你能控制调用 PowerShell 的具体脚本,这是最直接的方法。在使用读取内容的命令(如 Get-Content 或 Out-File)时,手动指定编码为 UTF-8。
例如,将原本的:
Get-Content "yourfile.txt"
修改为:
Get-Content "yourfile.txt" -Encoding UTF8
或者对于 PowerShell Core (pwsh),默认就是 UTF-8,但在 Windows PowerShell 5.x 及以下版本中,显式指定是最稳妥的。
2. 尝试使用 .NET 方法(兼容性更强)
如果你的 PowerShell 版本较老,或者 Get-Content 的参数表现诡异,可以直接调用底层的 .NET 类库来读取,这样控制力更强。
代码示例:
[System.IO.File]::ReadAllText("yourfile.txt", [System.Text.Encoding]::UTF8)
这个方法强制使用 UTF-8 解码,基本不会出现偏差。
3. 修改系统或会话默认编码(慎用)
如果你不想每次敲命令都加参数,可以尝试修改当前 PowerShell 会话的输出编码。但请注意,这可能只对当前窗口有效,重启后失效。
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
如果你使用的是 PowerShell 7+(即 pwsh),恭喜你,微软已经修复了这个历史包袱,默认编码就是 UTF-8,升级核心组件是彻底解决问题的长远之计。
总结
Codex 调用 PowerShell 出现乱码,本质上还是字符集不匹配的锅。在处理自动化脚本或跨平台文件时,养成显式指定编码的好习惯,可以避免 90% 的此类问题。
希望这篇小教程能帮你省下排查 Bug 的半小时,有其他奇怪的需求或问题,欢迎在评论区交流!

评论已关闭