最近在 Windows 上使用 Codex CLI 时,遇到了一个很诡异的问题:
- 直接在终端执行
bash -lc "echo 你好",输出正常。 - 让 Claude Code 帮我执行 bash,输出也正常。
- 只有 Codex 执行 bash 会出现中文乱码。
先放结论:这个问题最后不是靠 PowerShell 编码设置解决的,而是要给 Codex 设置 WSL_UTF8=1。

排查过程
1) 先怀疑是 PowerShell 编码问题
这是最直觉的一步。我先去改了 PS7 的 encoding,想着统一成 UTF-8。
C:\Users\<用户名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
内容:
1 | # Force UTF-8 (no BOM) for console + pipeline |
结果:无效。
2) 发现 Codex 实际走的是 PS5
继续看 Codex 的 debug 信息,发现我以为它在用 PS7,其实是 PS5。
所以我又把 PS5 的 encoding 也改了。
文件位置是C:\Users\<用户名>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
内容和PS7一样。
结果:还是无效。

3) 交叉验证:bash 本身其实没问题
为了排除“bash / WSL 本身坏了”,我做了两个对照:
- 我在命令行手动执行
bash -lc "echo 你好",是正常的。 - 我让 Claude Code 去执行 bash,也是正常的。
这说明问题并不在“bash 能不能输出中文”,而是出在 Codex 调用 bash/WSL 的链路 上。
为什么改 PS5/PS7 没用?
这个坑的关键是:
- PS5/PS7 的 UTF-8 设置,主要影响的是 PowerShell 自己的输入输出链路。
- 这次乱码发生在 bash/WSL 被重定向时,链路并不完全等同于纯 PowerShell。
- Codex 的
powershell_utf8特性也只覆盖 PowerShell,不覆盖 WSL bash。
所以你把 PowerShell 调到 UTF-8,很多场景会变好,但不一定能覆盖 Codex -> bash/WSL 这条路径。
最终解决方案:设置 WSL_UTF8=1
Codex 最后自己给出了正确方向:给环境变量 WSL_UTF8 赋值为 1。
你可以这样配:
1) 当前会话临时生效
1 | $env:WSL_UTF8 = "1" |
2) 给 Codex 持久生效(推荐)
在 ~/.codex/config.toml 里加:
1 | [shell_environment_policy.set] |
3) 启动时临时覆盖
1 | codex -c 'shell_environment_policy.set.WSL_UTF8="1"' |
验证结果
设置完后重启 Codex,再执行同类命令(比如 bash -lc "echo 你好")就恢复正常,不再乱码。

小结
如果你也遇到“Windows 下只有 Codex 执行 bash 才乱码”的情况:
- 不要只盯着 PS5/PS7 的 encoding。
- 先做对照实验(手动 bash、Claude Code、Codex)定位问题范围。
- 优先尝试给 Codex 设置
WSL_UTF8=1。
这个问题看起来像“编码没配好”,实际是“调用链路不同”导致的配置盲区。