$data = ['name' => '测试', 'url' => 'https://a.cn/b'];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

接口返回的中文在日志里是一串转义序列,虽然前端能解析,但接口文档和调试都很别扭。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:json_encode 默认转义非 ASCII 字符,需要显式加选项才保留原始中文。

「PHP json_encode 中文」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:输出时加 JSON_UNESCAPED_UNICODE;斜杠也一并取消转义;检查响应头字符集是否为 UTF-8。

确认没问题再收工,接口响应里直接显示中文和原始 URL,前端解析结果与之前一致。

作者 9823189