1. Windows 下 codex 中文乱码到底卡在哪codex 在 Windows 上跑起来之后输出中文变成一堆问号、方块或者锟斤拷这个问题我遇到过不止一次。它本质上不是 codex 本身不支持中文而是 Windows 终端这条链路上有好几个环节各自维护着一套编码只要有一环没对齐中文就会在传递过程中被拆坏。codex 是一个跑在终端里的命令行工具它把模型返回的文本写到标准输出终端再负责渲染。中间任何一层用了 GBK 或者默认代码页UTF-8 的中文就会碎掉。适合谁看这篇在 Windows 上用 codex 做日常编码、写脚本、跑 Agent 任务结果中文注释、中文提示、中文日志全变乱码的人。我试过在 PowerShell 5.1 和 PowerShell 7 下分别跑同一段中文输出结果完全不一样这也是排查的突破口。乱码通常出现在三个位置一是 codex 进程自己输出的中文二是它调用 shell 执行命令后回显的中文三是终端渲染层。很多人只改了终端字体或者只设了chcp 65001发现还是乱就是因为没把 PowerShell 的输入输出编码、$OutputEncoding和 codex 实际使用的终端版本一起对齐。这篇会从复现乱码开始一步步把终端编码、PowerShell profile、codex 的config.toml骨架以及 TaoToken 统一 Key 通道接入全部串起来最后给出可复制的验证动作。2. 先确认 codex 实际用的是哪个 PowerShell排查乱码第一步不是改配置而是搞清楚 codex 到底调用了哪个终端。Windows 上同时存在 PowerShell 5.1系统自带路径在C:\Windows\System32\WindowsPowerShell\v1.0和 PowerShell 7独立安装路径在C:\Program Files\PowerShell\7。这两个版本的默认编码行为差别很大5.1 默认走系统代码页7 默认走 UTF-8。我踩过的坑就是以为在 Microsoft Store 里装了 PowerShell 7 就能用结果 codex 读到的还是 5.1。原因是 Store 版 PowerShell 7 的安装目录在C:\Program Files\WindowsApps\下面这个目录有权限限制常规软件读不到也不会写进 PATH。所以 codex 启动 shell 时找到的还是系统自带的 5.1。正确做法是下载 MSI 安装包而不是用 Store。到 PowerShell 的 GitHub Releases 页面找PowerShell-7.6.1-win-x64.msi这个文件下载后双击安装。安装程序会自动把C:\Program Files\PowerShell\7写进系统 PATH。装完之后关掉所有终端窗口重新打开让 PATH 生效。然后让 codex 执行一条命令来确认版本$PSVersionTable如果输出里PSVersion是7.6.1、PSEdition是Core说明 codex 已经用上了 PowerShell 7。如果还是5.1.26100且PSEdition是Desktop说明 PATH 没生效或者 codex 缓存了旧的 shell 路径需要重启终端甚至重启 codex 进程。这一步是整个乱码修复的地基。终端版本不对后面 profile 里设的编码也可能被 5.1 的默认行为覆盖掉。3. 配置 PowerShell profile 统一 UTF-8 编码确认 codex 用的是 PowerShell 7 之后接下来要把 PowerShell 的输入输出编码固定成 UTF-8。PowerShell 7 虽然默认倾向 UTF-8但在某些调用场景下[Console]::OutputEncoding仍可能被系统区域设置影响尤其是中文 Windows 上默认代码页是 936GBK。profile 文件的位置在C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1如果这个文件不存在先创建目录和文件New-Item -ItemType Directory -Force (Split-Path $PROFILE) New-Item -ItemType File -Force $PROFILE然后把下面这段写进 profilechcp 65001 $null [Console]::InputEncoding [System.Text.UTF8Encoding]::new($false) [Console]::OutputEncoding [System.Text.UTF8Encoding]::new($false) $OutputEncoding [System.Text.UTF8Encoding]::new($false)逐行解释一下。chcp 65001把当前控制台代码页切成 UTF-8 $null是为了不把「Active code page: 65001」这行提示打出来干扰输出。[Console]::InputEncoding和[Console]::OutputEncoding分别设置控制台标准输入输出的编码用UTF8Encoding::new($false)表示不带 BOM避免某些工具把 BOM 当成内容。$OutputEncoding是 PowerShell 在管道里传给外部程序时用的编码这个不设codex 调用外部命令回显的中文照样会乱。写完之后让 codex 重新加载 profile 并验证. $PROFILE.CurrentUserAllHosts注意这里用的是CurrentUserAllHosts它对应的是Microsoft.PowerShell_profile.ps1的 AllHosts 变体能覆盖所有宿主。加载后再执行一次中文输出测试比如Write-Output 中文测试编码已对齐如果终端里正常显示中文说明 profile 这一层通了。4. codex 的 config.toml 骨架与 TaoToken 统一 Key 接入终端编码搞定后还要处理 codex 自己的配置。codex 的配置文件是config.toml放在用户目录下的.codex文件夹里Windows 上路径通常是C:\Users\你的用户名\.codex\config.toml这个文件控制 codex 用哪个模型、走哪个 API 端点、用什么 Key。如果你用 TaoToken 的统一 Key 通道可以把模型请求统一收敛到一个入口省得每个模型单独配 Key。TaoToken 的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。一个可复制的config.toml骨架大概长这样model claude-sonnet-4-20250514 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat这里几个字段要说明。model填你要用的模型名model_provider指向下面定义的 provider。base_url用 TaoToken 的 API 地址注意这里不加 UTM 参数保持干净。env_key是读取 API Key 的环境变量名不要把 Key 明文写进config.toml用环境变量更安全。wire_api一般填chat对应 OpenAI 兼容的 chat completions 格式。然后在 PowerShell 里设置环境变量$env:TAOTOKEN_API_KEY 你的Key如果要持久化写进用户环境变量[Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY, 你的Key, User)Key 可以在 TaoToken 的 API Keys 页面生成地址是https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。生成后复制填到环境变量里。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各语言的调用示例遇到字段不确定可以对照。配置写完后codex 启动时会读这个文件把请求发到 TaoToken 的通道再由通道转发到对应模型。这样中文乱码的修复和 Key 通道接入就串在一条线上了。5. 验证请求与中文输出是否正常配置改完不能只看文件要实际发一次请求验证。最直接的方式是让 codex 执行一个带中文输出的任务比如codex 用中文写一个 PowerShell 函数输出当前时间和一句问候观察终端里的返回。如果中文正常显示没有问号、方块、锟斤拷说明整条链路通了。如果还是乱先确认$PSVersionTable是 7.x再确认 profile 已加载。也可以单独测 API 通道是否通。用 curl 发一个请求curl.exe https://taotoken.net/api/v1/chat/completions -H Authorization: Bearer $env:TAOTOKEN_API_KEY -H Content-Type: application/json -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:用中文回复通道正常}]}注意 Windows 上要用curl.exe而不是curl因为 PowerShell 里curl是Invoke-WebRequest的别名参数格式不一样。返回的 JSON 里content字段如果是正常中文说明 API 通道和编码都没问题。如果想在图形界面里直接验证模型对话可以打开 TaoToken 的模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite选同一个模型发一句中文对比终端和网页的输出是否一致。网页正常、终端乱问题就在终端编码两边都乱问题在请求参数或模型侧。长期用 codex 做编码和 Agent 任务的话可以考虑 Coding Plan地址是https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite适合高频调用场景。6. 本篇常见错排查乱码修不好多半是下面几个点没对齐。第一个PowerShell 版本没确认。很多人改了 profile 但 codex 用的还是 5.1profile 路径都不一样5.1 的 profile 在Documents\WindowsPowerShell\下改了也白改。一定要先用$PSVersionTable确认 codex 实际调用的版本。第二个Store 版 PowerShell 7 的坑。Store 安装的目录在WindowsApps下PATH 不写常规软件读不到。必须用 MSI 安装包装完重启终端。第三个profile 没加载。改完Microsoft.PowerShell_profile.ps1后当前会话不会自动生效要手动. $PROFILE.CurrentUserAllHosts或者重开终端。codex 启动新 shell 时会读 profile但如果 codex 进程本身没重启它可能还持有旧的环境。第四个$OutputEncoding漏设。只设[Console]::OutputEncoding不够管道传给外部程序时用的是$OutputEncoding这个不设codex 调用外部命令回显的中文照样乱。第五个config.toml里 Key 写错位置。env_key填的是环境变量名不是 Key 本身。把 Key 明文写进config.toml不仅不安全还可能因为特殊字符导致解析失败。第六个base_url带了多余路径。TaoToken 的 API 地址是https://taotoken.net/api不要自己拼/v1之外的路径具体以接入文档为准。第七个终端字体不支持中文。这个概率低但如果编码全对还是显示方块检查一下终端字体是不是只装了英文字体换成等宽中文字体试试。排查顺序建议从版本确认开始再到 profile再到 config.toml最后到 API 通道一层层往下别跳步。每改一层就验证一次这样出问题能快速定位是哪一层没对齐。