Windows 下 Codex 执行 bash 中文乱码问题排查与解决

最近在 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
2
3
4
5
6
7
8
# Force UTF-8 (no BOM) for console + pipeline
$Utf8NoBom = [System.Text.UTF8Encoding]::new($false)
[Console]::InputEncoding = $Utf8NoBom
[Console]::OutputEncoding = $Utf8NoBom
$OutputEncoding = $Utf8NoBom

# Ensure code page is UTF-8
chcp 65001 > $null

结果:无效。

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
2
[shell_environment_policy.set]
WSL_UTF8 = "1"

3) 启动时临时覆盖

1
codex -c 'shell_environment_policy.set.WSL_UTF8="1"'

验证结果

设置完后重启 Codex,再执行同类命令(比如 bash -lc "echo 你好")就恢复正常,不再乱码。

小结

如果你也遇到“Windows 下只有 Codex 执行 bash 才乱码”的情况:

  1. 不要只盯着 PS5/PS7 的 encoding。
  2. 先做对照实验(手动 bash、Claude Code、Codex)定位问题范围。
  3. 优先尝试给 Codex 设置 WSL_UTF8=1

这个问题看起来像“编码没配好”,实际是“调用链路不同”导致的配置盲区。