1. Codex 中文乱码到底乱在哪:终端输出与文件读写全链路定位
Codex 在中文项目里最常见的乱码,不是模型把字认错了,而是字节流在「模型输出 → 终端渲染 → 文件落盘 → IDE 读取」这条链路上被反复转码。我试过在一个 Windows 11 + PowerShell 5.1 的环境里让 Codex 生成一段带中文注释的 Python 脚本,终端里显示的是「测试」这种典型 UTF-8 被当 Latin-1 解读的乱码,但用 VS Code 打开同一个文件又是正常中文。这说明问题不在 Codex 本身,而在中间某一层用了错误的编码去解释字节。
先把链路画清楚,你才能对症下药:
Codex / Node / CLI 内部统一按 UTF-8 处理字符串,输出到 stdout 时也是 UTF-8 字节流。到了 Windows PowerShell 5.1,控制台的默认代码页是 GBK(936),它拿到 UTF-8 字节后按 GBK 解码,于是中文变成乱码。如果 Codex 把内容写进文件,Node 的fs.writeFileSync默认也是 UTF-8,这一步通常没问题;但如果中间经过 PowerShell 的Out-File或Set-Content,默认编码在 5.1 里是 UTF-16LE,在 7.x 里是 UTF-8,版本不同结果不同。最后 IDE 按 UTF-8 读取,如果文件实际是 UTF-16 或 GBK,就又乱一次。
所以「codex 中文乱码」这个搜索词背后,至少有三个独立故障点:终端代码页、PowerShell 输出编码、文件写入编码。你要做的是逐层确认,而不是改一个地方就以为好了。
适合谁看:用 Codex 做中文项目开发、在 Windows 上跑 CLI、或者用 WSL 调 bash 的工程师。下面每一步都给可复制命令和预期结果,你照着跑一遍就能定位自己卡在哪一层。
2. 用 TaoToken 统一 Key 与 API 通道接入 Codex 的前置准备
在排查编码之前,先把 Codex 的接入通道固定下来,否则你无法判断乱码是模型返回内容的问题还是本地环境的问题。TaoToken 的作用是给你一个统一的 Key 和 API 入口,让 Codex 的请求走同一条通道,这样复现和验证才有可比性。
你需要准备三样东西:Base URL、API Key、Model ID。Base URL 用https://taotoken.net/api,注意这个地址不带任何查询参数。API Key 在控制台创建,地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,进去后新建一个 Key,复制出来保存好。Model ID 根据你用的模型填,比如gpt-4o或claude-3-5-sonnet这类,具体以文档为准,文档入口在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。
如果你用的是 Claude Code 这类工具,配置方式略有不同,可以参考https://taotoken.net/claudecode?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite里的说明。核心逻辑是一样的:把请求指向 TaoToken 的 API 地址,带上你的 Key,指定 Model ID。
为什么要先做这一步?因为编码问题排查最怕变量太多。如果你一会儿用官方通道、一会儿用别的通道,模型返回的字节流可能因为网关处理不同而有差异。固定用 TaoToken 之后,你就能确认「同样的请求,在修好终端编码前后,输出是否一致」。如果修之前乱、修之后正常,说明问题在本地;如果修完还乱,那就要看请求本身或模型返回。
另外提醒一点:不要把 Key 硬编码在脚本里提交到仓库。用环境变量或者本地配置文件,后面配置片段里我会给具体写法。
3. 可复制的 locale、终端与文件编码配置片段
这一节是核心,给你可以直接粘贴的配置。分三块:PowerShell 7 安装与 profile、Codex 的 settings 配置、以及文件写入编码的强制设定。
3.1 安装 PowerShell 7 并写入 profile
Windows PowerShell 5.1 的编码问题太多,直接换 7.x。用 winget 安装:
winget install --id Microsoft.Powershell装完关掉当前窗口,重新打开,确认版本:
pwsh如果输出PowerShell 7.x.x就对了。接着创建 profile 文件:
New-Item -ItemType File -Path $PROFILE -Force notepad $PROFILE在打开的记事本里写入以下内容,保存:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $OutputEncoding = [System.Text.Encoding]::UTF8 $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' $PSDefaultParameterValues['Set-Content:Encoding'] = 'utf8' $PSDefaultParameterValues['Add-Content:Encoding'] = 'utf8'这五行分别管:控制台输出编码、管道输出编码、Out-File 默认编码、Set-Content 默认编码、Add-Content 默认编码。全部锁死 UTF-8,避免 PowerShell 自己偷偷转成 UTF-16。
3.2 Codex 的 settings 配置片段
Codex 的配置通常放在用户目录下的配置文件中。以 JSON 格式为例,路径按你的实际安装位置来,内容如下:
{ "api_base": "https://taotoken.net/api", "api_key": "你的_TaoToken_Key", "model": "gpt-4o", "encoding": "utf-8", "output_encoding": "utf-8" }如果你用的是 TOML 格式的配置,等价写法:
api_base = "https://taotoken.net/api" api_key = "你的_TaoToken_Key" model = "gpt-4o" encoding = "utf-8" output_encoding = "utf-8"注意api_base后面不要加斜杠,也不要带 UTM 参数,保持https://taotoken.net/api这个形式。Key 建议用环境变量引用,比如"api_key": "${TAOTOKEN_API_KEY}",然后在系统环境变量里设置TAOTOKEN_API_KEY。
3.3 WSL / Bash 场景的补充
如果 Codex 调用 bash 出现乱码,加一个环境变量:
$env:WSL_UTF8="1"这会让 WSL 输出按 UTF-8 处理。如果你在.bashrc或.zshrc里也可以加:
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8这两行确保 bash 自身的 locale 是 UTF-8,避免它把中文当字节流乱传。
4. 验证请求与成功结果:确认乱码是否消除
配置写完,必须验证。分三步:验证终端编码、验证 Codex 输出、验证文件读写。
第一步,在 PowerShell 7 里执行:
[Console]::OutputEncoding预期输出是:
BodyName : utf-8 EncodingName : Unicode (UTF-8)如果还是gb2312或936,说明 profile 没生效,检查$PROFILE路径是否正确,或者用pwsh -NoProfile对比一下。
第二步,让 Codex 输出一段中文。你可以直接跑一个简单请求,比如让它生成「你好,世界」的 Python 代码。观察终端显示是否正常。如果之前是「ä½ å¥½」现在变成「你好」,说明终端层修好了。
第三步,验证文件写入。让 Codex 把中文内容写进一个.txt文件,然后用 PowerShell 读取:
Get-Content .\test.txt -Encoding UTF8再用 VS Code 打开同一个文件,确认两边显示一致。如果 PowerShell 读出来正常、VS Code 也正常,说明文件编码是 UTF-8 且被正确识别。
我实测下来,最容易漏的是第三步。很多人终端修好了,但 Codex 写文件时走了Out-File没走 Node 的fs,结果文件变成 UTF-16,IDE 一读就乱。所以 profile 里那三行PSDefaultParameterValues很关键,它把 PowerShell 所有写文件命令的默认编码都改成 UTF-8 了。
如果你要更彻底,可以在 Codex 的输出环节加一个显式转换,比如在 Node 脚本里:
const fs = require('fs'); fs.writeFileSync('output.txt', content, { encoding: 'utf8' });这样就不依赖 PowerShell 的默认行为了。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中你会遇到几类典型报错,逐个说。
401 Unauthorized:Key 不对或没带上。检查api_key字段是否填了 TaoToken 控制台创建的 Key,有没有多余空格。如果你用环境变量,确认TAOTOKEN_API_KEY在当前终端里能echo出来。另外确认api_base是https://taotoken.net/api,不要写成带 UTM 的地址。
local proxy failed:本地代理配置冲突。如果你系统里设了 HTTP_PROXY 或 HTTPS_PROXY,Codex 可能走了代理导致连接失败。临时清掉:
$env:HTTP_PROXY="" $env:HTTPS_PROXY=""然后重试。注意这里说的是本地环境变量清理,不是让你去搞什么网络工具,纯粹是排除干扰项。
reading choices 报错:通常是返回体格式和 Codex 预期的不一致。检查 Model ID 是否拼写正确,比如gpt-4o不要写成gpt4o。如果用的是 Claude 系列,确认模型名和 TaoToken 文档里列的一致。这个错误也可能出现在流式返回被中断时,重试一次往往就好。
OAuth 相关报错:如果你用的是需要 OAuth 的工具(比如某些 Claude Code 场景),确认回调地址和 Key 配置匹配。TaoToken 的 Claude Code 接入说明在https://taotoken.net/claudecode?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,按里面的步骤走。OAuth 失败多半是回调 URL 没填对或者 Key 权限不足。
还有一个隐蔽的坑:Codex 的配置文件路径。不同版本可能读不同的文件,比如~/.codex/config.json和~/.config/codex/settings.json都可能。你改了一个没生效,先确认它实际读的是哪个。可以用codex --help或者看启动日志里的配置加载路径。
排查清单建议你按这个顺序走:先确认终端编码 → 再确认 Codex 配置里的 api_base 和 key → 再确认文件写入编码 → 最后看报错信息。每一步只改一个变量,改完立刻验证,不要一次改一堆。
6. 长期编码与 Agent 场景:用 Coding Plan 固定通道
如果你只是偶尔跑一下 Codex,上面的配置够用了。但如果你长期用 Codex 做中文项目开发,或者跑 Agent 任务,建议把通道固定下来,避免每次环境变动都要重新排查。
TaoToken 的 Coding Plan 适合这种场景,入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite。它的好处是你不用每次手动配 Key 和 Base URL,通道统一之后,编码问题的变量就只剩本地环境了。你可以在模型对话页面先试一下中文输出是否正常,地址是https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,确认模型侧没问题,再回到本地排查终端和文件。
API Key 管理在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,你可以给不同项目建不同的 Key,方便追踪是哪个环节出的问题。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite,里面有各工具的配置示例。
最后给你一个实用技巧:把本文的排查步骤写成一个check-encoding.ps1脚本,每次换机器或者升级环境后跑一遍。脚本内容就是依次输出[Console]::OutputEncoding、$OutputEncoding、$PSVersionTable.PSVersion,再让 Codex 生成一段中文测试文本写文件读回来。这样你三十秒就能确认环境是否健康,不用等到项目里出现乱码才回头查。