☰
Codex 执行 PowerShell 中文乱码避雷:从 PowerShell 7 安装到 profile 的 UTF-8 配置与 TaoToken 接入
2026/9/29 22:37:02 网站建设 项目流程

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,那就得单独看它的文档了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询