先保留一份原始响应证据
中文乱码最怕只看前端截图。截图只能说明最后展示错了,不能说明 AI 模型接口输出错了、网关转码错了,还是浏览器解码错了。正确做法是先保存原始响应头、前几十个字节、完整 body 摘要和 request_id。涉及流式输出时,还要保留每个 chunk 的边界,因为 UTF-8 中文字符可能跨分片,如果前端按字符串随意截断,就会出现半个字符被替换成问号。
永沃云枢在 https://ai.jn83.com 的模型调用管理场景里,会把“模型返回内容”和“页面展示内容”分开验收。这样排查 AI 自动化办公报告、客服回复、Codex 生成说明和 CCSwitch 配置测试时,能快速判断问题发生在模型侧、代理侧、服务端解析侧还是前端渲染侧。
适用场景
这套方法适合聊天前端、批量生成文章、AI 自动化办公报告、客服工单摘要、开发者控制台日志、Webhook 回调和流式输出页面。只要出现中文变问号、日文或繁体字符丢失、emoji 变方块、JSON 可解析但文本损坏,都应按编码链路排查,而不是反复切换模型。
操作步骤:按五层定位乱码来源
- 固定最小输入。准备一句包含中文、英文、数字和标点的短提示词,例如“请返回:永沃云枢 AI API 测试 123”。不要用长文章开始排查。
- 检查响应头。确认
Content-Type是否包含charset=utf-8,代理层是否改写为其它编码。若是 SSE,确认类型为text/event-stream且没有中间层压缩破坏边界。 - 保存原始字节。服务端可把响应写入 UTF-8 文件,PowerShell 读取中文时使用
Get-Content -Encoding UTF8;不要用默认编码猜测。 - 分离代理和前端。用后端日志看模型原文,再用浏览器 Network 面板看响应,再看页面 DOM。三处只有一处乱码,就能缩小范围。
- 流式解码用增量 decoder。前端不要对每个
Uint8Array直接转字符串后拼接,应该使用TextDecoder("utf-8", { fatal: false })并开启流式解码。
失败表现与原因对照
如果日志原文正确、前端乱码,重点查浏览器解码和响应头;如果日志已经是问号,查服务端读取、数据库字段和日志库编码;如果非流式正常、流式乱码,查 chunk 边界和增量解码;如果只在某个 provider 下出现,查 CCSwitch profile 的代理链路和网关转发;如果只有导出的 CSV 或 Excel 乱码,查文件写入编码和 BOM 策略。
常见问题 / 避坑
第一,不要把问号当成模型质量问题,真正的模型输出通常不会随机把所有中文替换成问号。第二,不要在服务端先用错误编码转成字符串再转回 UTF-8,信息已经丢失时无法完全恢复。第三,不要把日志、数据库和页面展示混为一谈。可以参考 AI API 流式输出中断后的分片缓存与重放 和 Codex 静态页面编码检查,先把证据保存下来。
检查清单
- 最小测试输入包含中文、英文、数字和标点,并能稳定复现。
- 原始响应头、字节摘要、服务端日志、浏览器 Network 和页面 DOM 已分开检查。
- SSE 或流式输出使用增量 UTF-8 解码,没有按半个 chunk 截断字符。
- 日志文件、导出文件和数据库字段都明确使用 UTF-8 保存。
- AI API 接入、AI 模型接口、Codex 接入和开发者 AI 调用链路共用同一套 request_id。
- 站内排错入口已补到 AI API 接入专题、Codex 专题、CCSwitch 配置专题 和 AI 自动化办公专题。
FAQ:乱码修复后怎么验收
不要只刷新页面看一次。建议准备三类样本:短中文、长段落、流式多段输出。每类样本都检查服务端日志、浏览器 Network、页面展示和历史记录。若 AI 自动化办公还会导出 Word、PDF 或表格,还要单独检查导出文件。验收通过的标准是:同一个 request_id 从模型响应到页面展示,文本内容一致,没有连续问号、替换字符和截断句子。
在永沃云枢的 https://ai.jn83.com 使用场景里,乱码不仅影响阅读,也会影响客服工单、PPT 汇总、合同摘要和模型调用管理审计。编码链路稳定后,再去优化 prompt、路由和成本,顺序会更可靠。
排查命令示例
本地排查可以先用只读方式保存测试响应,再用十六进制查看前几个字节。Windows 下处理中文文件时明确使用 UTF-8,例如 Get-Content -LiteralPath ".\\response.txt" -Encoding UTF8。如果文件读取正常但页面乱码,问题多半在 HTTP 响应头或前端解码;如果文件里已经损坏,继续向上游查代理和服务端解析。
这类证据也适合交给 Codex 继续分析:提供 request_id、响应头、脱敏 body 摘要和复现命令,而不是只给一句“中文乱码”。Codex 才能沿着真实链路判断改哪一层。