CodeX CLI 中文输出乱码:LANG 照原文查,Base URL 填 TaoToken
codex "用中文解释代码"回你一串这是一段代ç,codex "创建中文 README.md"落盘后文件里是æÂ£å¸¸,Windows 上更离谱,直接τÖç«á内容。这不是模型不会中文,而是 CodeX CLI 吐出的 UTF-8 字节流,在终端、Windows GBK/CP936、SSH、文件、管道这五处其中某一处,被按另一种编码解释了。处理这类 mojibake,顺序比努力重要:先把请求通道固定下来——到 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 Key,把 Codex 的~/.codex/config.toml里base_url指向https://taotoken.net/api——这样你反复用中文 prompt 复现乱码时,Token 消耗走的是同一条通道,不会出现「换个 Key 结果变了」的干扰变量。TaoToken 只提供 Key 与 Base URL,它不参与任何编码转换;LANG、locale、chcp、iconv该查还是逐项查。
1. CodeX CLI 中文输出乱码的四种现场与适用场景
先把现象分型,不同类型对应的链路环节完全不同。
# 现场一:中文输出乱码 $ codex "用中文解释代码" # 输出: 这是一段代ç # 期望: 这是一段代码# 现场二:终端交互乱码 $ codex > hello # 输出: â"œå"œå—符# 现场三:写入文件乱码 $ codex "创建中文 README.md" # 文件中: æÂ£å¸¸ # 期望: 正常# 现场四:Windows 上乱码 > codex "task" # 输出: τÖç«á内容四类现象对应的排查方向不一样:现场一偏终端与 locale,现场二偏输入回显编码,现场三偏文件写入编码,现场四基本锁定 Windows 代码页。以下场景出现概率最高:终端编码不是 UTF-8、Windows 使用 GBK/CP936、SSH 本地与远程编码不匹配、CodeX 写出的文件不是 UTF-8、管道与重定向丢编码、LANG/LC_ALL从未设置过。
2. 接入前置:在 TaoToken 创建 Key 并选定模型 ID
编码排查要反复跑中文 prompt,跑一次就消耗一次 Token,所以先把通道定死。步骤很短:
- 打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,完成注册。
- 进入控制台创建 API Key,页面在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex-encoding-keys ,创建后立刻复制,只显示一次。
- 在模型广场挑一个模型,把它对应的模型 ID 记下来。模型 ID 以官网模型广场实时展示为准,不要凭记忆填。
- 注意区分两个地址:
https://taotoken.net/api是给工具填的接口基址;带utm_source的官网链接是给人点开注册用的,把它粘进配置文件是错的。
3. Codex 可复制配置:config.toml 里 base_url 填 https://taotoken.net/api
Codex CLI 读取~/.codex/config.toml。Windows 下是%USERPROFILE%\.codex\config.toml。编辑如下:
# ~/.codex/config.toml model = "<在官网模型广场选定的模型 ID>" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"Key 不放配置文件里,走环境变量:
# macOS / Linux export TAOTOKEN_API_KEY=YOUR_API_KEY echo 'export TAOTOKEN_API_KEY=YOUR_API_KEY' >> ~/.zshrc source ~/.zshrc# Windows PowerShell $env:TAOTOKEN_API_KEY="YOUR_API_KEY" [Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY","YOUR_API_KEY","User")三个易错点:base_url末尾不要加/v1;不要填成官网首页地址;model里不要留占位符字符串,要换成真实模型 ID。配置改完不需要动LANG,两者是两件事。
4. 一条命令复现并验证:echo "中文测试" 加中文 prompt
配置就绪后,先做一次链路自检,再让 CodeX 说话。
# 1. 终端自身能不能显示中文 echo "中文测试" # 2. 当前 locale 是不是 UTF-8 locale echo $LANG如果第 1 步就乱码,问题跟 CodeX 无关,是终端编码。第 1 步正常,再跑中文 prompt:
codex "用中文解释这段代码:print('hi')"想拿到稳定可测的输出,用打印模式加管道落盘:
codex --print "只输出六个汉字:中文测试正常" > out.txt file out.txt hexdump -C out.txt | head -3 cat out.txt判定标准很直接:file out.txt显示 UTF-8、hexdump能看到e4 b8 ad这类三字节序列、cat出来是「中文测试正常」,说明终端到文件整条链路一致。若hexdump是 UTF-8 但cat是乱码,问题在终端显示;若hexdump就不是 UTF-8,问题在写入环节。这一步做完,你已经能把乱码定位到「终端 / 文件 / 管道」三者之一。
5. 编码链路逐项排查:LANG、macOS、Windows、SSH、文件、管道
5.1 方案一:LANG 与 LC_ALL(通用,优先级最高)
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 echo 'export LANG=en_US.UTF-8' >> ~/.zshrc echo 'export LC_ALL=en_US.UTF-8' >> ~/.zshrc source ~/.zshrc localelocale输出里LC_ALL=为空、LANG=C或LANG=POSIX都属于没设好。要确认系统真的装了对应 locale:locale -a | grep -i utf,没有的话zh_CN.UTF-8也可能报错,此时用en_US.UTF-8更稳。改完必须重开 CodeX 进程,子进程继承的是启动时的环境。
5.2 方案二:macOS 终端与 iTerm2
系统 Terminal:偏好设置 → 描述文件 → 文本 → 编码选「Unicode (UTF-8)」。iTerm2:Preferences → Profiles → Terminal → Terminal Emulation,确认使用 Unicode 且宽度设置正确。改完在同一窗口执行:
echo "中文测试" codex "用中文回答"终端设置与 shell 的LANG是两层,终端层不对,LANG设了也白设。
5.3 方案三:Windows 代码页与 PowerShell 编码
chcp 65001 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8 codex "task"chcp 65001只对当前窗口生效,重开就回到 CP936。要长期生效,在「设置 → 时间和语言 → 语言 → 管理语言设置 → 更改系统区域设置」中勾选使用 Unicode UTF-8 的 Beta 选项,然后重启。另外 Windows Terminal 与旧版控制台行为不同,如果在旧版 conhost 里始终乱码,先在 Windows Terminal 里复测一次再下结论。
5.4 方案四:SSH 两端编码对齐
# ~/.ssh/config Host * SendEnv LANG LC_ALL SetEnv LANG=en_US.UTF-8ssh user@server export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 locale codex "task"SendEnv需要服务端sshd_config里有对应的AcceptEnv才会被接收,否则只在远程侧export一样有效。远程乱码最常见的成因是本地 UTF-8、远程LANG=C,两边不一致。
5.5 方案五:文件编码修复与校验
file README.md iconv -f GBK -t UTF-8 README.md > README_utf8.md mv README_utf8.md README.md file README.md cat README.md方向别搞反:-f是源编码,-t是目标编码,从 GBK 转 UTF-8 就是-f GBK -t UTF-8。文件确认是 UTF-8 后,再让 CodeX 写:
export LANG=en_US.UTF-8 codex "创建中文 README.md" file README.md5.6 方案六:管道与重定向保持 UTF-8
export LANG=en_US.UTF-8 codex --print "task" | cat codex --print "task" > output.txt file output.txt codex --print "task" | iconv -f UTF-8 -t UTF-8 > output.txt cat output.txt管道两端编码不一致时,中间环节会按LANG重新解释字节。VS Code 集成终端里还有一层独立设置,在 settings.json 中加:
{ "terminal.integrated.encoding": "utf8" }6. 常见错误与排查
- 设了
LANG仍乱码:检查是否只写进了当前会话,echo $LANG与locale都要看;子进程需重启才继承新环境。 LANG=zh_CN.UTF-8报错或无效:系统未安装该 locale,locale -a确认后改用en_US.UTF-8。- Windows 改完
chcp一切正常,重开又乱:临时改代码页不持久,需改系统区域设置。 base_url填成带utm的官网链接:请求打不到接口,会被当成编码问题一起排查,白白绕路;正确值是https://taotoken.net/api,且不带/v1。- 终端正常但文件乱:写入路径上的编码没统一,用
file与hexdump -C对比字节,不要凭cat下结论。 - 管道正常但重定向乱:
>与|走的处理不同,分别验证,必要时加一层iconv -f UTF-8 -t UTF-8做透传。 - 英文输出正常、只有中文乱:可以确定不在模型侧,直接按第 5 节逐项对编码,不必重装 CLI。
速查清单:export LANG=en_US.UTF-8、export LC_ALL=en_US.UTF-8、locale复核、macOS 终端编码、Windowschcp 65001、SSHSendEnv LANG LC_ALL、file查文件、iconv转码、Docker 加-e LANG=en_US.UTF-8、管道与重定向保持一致。
7. 长期统一 UTF-8 与下一步动作
编码问题的根因只有一个:链路里有环节不在 UTF-8 上。把终端、shell、Windows 代码页、SSH 两端、文件写入、管道重定向全部对齐到 UTF-8,codex "用中文解释代码"就不会再吐这是。刚才你已经完成了 Key 创建与config.toml的base_url填写,接下来可以按需推进:
- 还想再核对一遍 Key 与接口地址的写法,直接看 API Keys 与 Claude Code 接入文档:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex-encoding-keys 与 https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex-encoding-doc 。
- 想先用中文 prompt 手动试通一次,确认模型 ID 可用与输出正常,去模型对话页:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex-encoding-chat 。
- 如果 CodeX 要长期跑中文文档生成、代码注释翻译这类批量任务,看 Coding Plan 的额度方案:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codex-encoding-plan 。
把编码统一这件事一次做干净,比每次遇到乱码再救火省事得多。