1. Codex 调 PowerShell 中文乱码到底卡在哪
Codex 在 Windows 上执行 PowerShell 命令时,只要输出里带中文,终端里经常直接变成一串问号或者方块。这个现象不是 Codex 本身坏了,而是编码链路里有一环没对齐:Codex 启动 PowerShell 的方式、PowerShell 自己的输出编码、控制台代码页、以及文件读写默认编码,这几层任意一层不是 UTF-8,中文就会在传递过程中被替换成?。
我实测下来,最容易被误导的地方是:很多人以为装了 PowerShell 7 就万事大吉,结果 Codex 压根没调用 pwsh.exe,还是走系统的 Windows PowerShell 5.1;也有人改了$PROFILE,本机终端里中文正常了,但 Codex 跑命令时依然乱码,因为 Codex 执行命令的方式不一定加载你的 profile。所以这篇不绕弯子,直接把「安装避雷 + profile 配置 + 环境变量 + 代码页 + TaoToken 接入」串成一条可复制的路径,让你一次性把乱码按死。
适合谁看:在 Windows 上用 Codex 做编码、跑脚本、读日志,输出里经常出现中文乱码的开发者;以及想把模型调用统一走一个 Key/API 通道、顺便把终端环境理顺的人。下面每一步都给命令和预期结果,你可以边看边敲。
2. 先把 PowerShell 7 装对,别让 Codex 继续用 5.1
2.1 安装 PowerShell 7 的正确姿势
PowerShell 7 默认就是 UTF-8,这是它比 5.1 省心的地方。但「装了」不等于「Codex 会用」。推荐用 winget 装,版本可控:
winget install --id Microsoft.PowerShell --source winget装完后确认可执行文件位置,通常是:
Get-Command pwsh | Select-Object Source预期输出类似C:\Program Files\PowerShell\7\pwsh.exe。如果这条命令报找不到pwsh,说明 PATH 没刷新,重开一个终端再试。
2.2 让 Codex 真正调用 pwsh 而不是 powershell.exe
这是第一个大坑。系统里powershell.exe指向 5.1,pwsh.exe才是 7。Codex 默认可能调前者。你要做的是在 Codex 的配置里显式指定 shell 路径。以config.toml为例:
[shell] program = "C:\\Program Files\\PowerShell\\7\\pwsh.exe" args = ["-NoLogo", "-NoProfile", "-Command"]注意-NoProfile这个参数:它会让 PowerShell 跳过 profile 加载。如果你后面要靠 profile 设编码,这里就别加-NoProfile;如果你打算用环境变量和代码页统一控制,那加-NoProfile反而更干净、启动更快。两种思路二选一,别混着来,否则你会以为 profile 没生效,其实是-NoProfile把它屏蔽了。
提示:先用
pwsh -Command "$PSVersionTable.PSVersion"确认版本是 7.x,再改 Codex 配置,顺序反了会白折腾。
3. profile 与环境变量:把 UTF-8 钉死在每一层
3.1 profile 配置片段(可复制)
打开 profile 文件:
code $PROFILE如果提示文件不存在,先创建目录再新建。把下面这段贴进去:
# 强制控制台代码页为 UTF-8 chcp 65001 | Out-Null # 控制台输入输出编码 [Console]::InputEncoding = [System.Text.UTF8Encoding]::new() [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() # 管道输出编码 $OutputEncoding = [System.Text.UTF8Encoding]::new() # 文件读写默认编码 $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8' $PSDefaultParameterValues['Set-Content:Encoding'] = 'utf8' $PSDefaultParameterValues['Add-Content:Encoding'] = 'utf8'保存后重开终端,验证:
[Console]::OutputEncoding.WebName预期输出utf-8。如果还是gb2312或别的,说明 profile 没被加载,回到 2.2 检查是不是加了-NoProfile。
3.2 环境变量兜底
profile 只在交互式会话里稳,Codex 这种非交互调用不一定吃。所以再加一层系统级环境变量,让子进程继承 UTF-8:
[Environment]::SetEnvironmentVariable("PYTHONUTF8", "1", "User") [Environment]::SetEnvironmentVariable("PYTHONIOENCODING", "utf-8", "User")设完要重开终端才生效。PYTHONUTF8=1对 Codex 里跑 Python 脚本读中文文件特别有用,能避免 Python 自己按 GBK 解码。
3.3 代码页调整的边界
chcp 65001只影响当前控制台会话,新开的窗口会回到默认。所以它必须配合 profile 或启动参数一起用,单独敲一次没意义。如果你在 CI 或脚本里跑,直接在命令前拼chcp 65001 >nul &&也行。
4. TaoToken 接入:统一 Key 与 API 通道
环境理顺后,把模型调用也统一掉,省得每个工具配一套 Key。TaoToken 提供统一的 API 通道,兼容常见调用格式。先到控制台拿 Key:
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
拿到 Key 后,在 Codex 的config.toml里配置模型通道骨架:
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "sk-你的Key" model = "claude-sonnet-4-5"如果你用的是settings.json风格的工具,对应骨架:
{ "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key", "model": "claude-sonnet-4-5" } }API 基础地址就是https://taotoken.net/api,不要加多余路径。想先验证模型通不通,可以直接用模型对话页试一句中文,看返回是否正常:
- 模型对话:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
如果你长期用 Codex 做编码或跑 Agent,建议走 Coding Plan,额度更划算:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
接入文档在这里,参数细节以文档为准:
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
5. 验证请求与预期输出
配置完别急着跑大任务,先用一条带中文的命令验证编码链路。在 Codex 里执行:
pwsh -Command "Write-Output '中文测试:编码正常'"预期输出就是原样中文,没有问号。如果这里正常,再测文件读取:
pwsh -Command "Get-Content .\test.txt -Encoding utf8"准备一个test.txt,里面写几行中文。预期能完整读出。接着验证模型通道,用 curl 打一发:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"用中文回一句话"}]}'预期返回 JSON 里content是正常中文。如果这一步返回乱码,问题在模型通道而非 PowerShell,分开定位能省很多时间。
6. 本篇常见错排查
改了 profile 没效果:九成是 Codex 启动带了-NoProfile,或者根本没调 pwsh。用Get-Command pwsh和 Codex 配置里的program路径对一遍。
装了 PowerShell 7 但版本还是 5.1:Codex 配置里写的是powershell.exe。改成pwsh.exe的完整路径。
中文变问号但英文正常:控制台代码页不是 65001,或者[Console]::OutputEncoding没设。回到 3.1 逐条验证。
Python 脚本读中文报 UnicodeDecodeError:PYTHONUTF8=1没生效,重开终端或检查是否设到了 User 级。
curl 返回乱码:终端本身编码问题,不是 API 问题。先chcp 65001再试,或把返回重定向到文件用编辑器看。
profile 路径找不到:$PROFILE在 5.1 和 7 里指向不同文件,确认你编辑的是 pwsh 对应的那个。
把这几条对照着排,基本能覆盖 95% 的乱码场景。剩下的多半是某个工具自己硬编码了 GBK,那就得单独看它的文档了。