thinkphp6接口json中文显示为u5f20u4e09或乱码,主因是utf-8编码链路未对齐:php文件含bom、json_encode未启用json_unescaped_unicode、响应头缺失charset=utf-8、数据源非utf-8。

ThinkPHP6接口返回JSON时出现中文显示为 u5f20u4e09 或问号、方块、空白,本质不是“乱码bug”,而是编码链路中某环节未对齐UTF-8所致。关键不在JSON本身,而在源头、序列化方式和响应头三处协同失效。
确保所有PHP文件是UTF-8无BOM格式
这是最隐蔽也最致命的一环。哪怕一个配置文件或路由文件开头带了BOM(EF BB BF),就会在json()执行前产生不可见输出,导致JSON结构损坏,浏览器报错 Unexpected token in JSON at position 0。
- 用VS Code或PhpStorm打开
app/、config/、route/、lang/目录下所有PHP文件,右下角点击编码 → 选择「Save with Encoding」→「UTF-8」(明确不含BOM) - 避免用Windows记事本另存为UTF-8——它默认加BOM;推荐Notepad++:编码 → 转为UTF-8无BOM格式 → 保存
- 检查语言包文件:
xxd lang/zh-cn.php | head -1,若开头出现ef bb bf即含BOM,必须清除
让中文不转义:启用JSON_UNESCAPED_UNICODE
json($data)默认把中文转成uXXXX,虽不影响前端解析,但调试困难、日志难读。修复需显式启用该标志:
用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...
- TP6.1+:直接在
config/app.php中添加配置:'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES],
此后所有json()、response()->json()、异常响应均自动生效 - TP6.0:不支持全局配置,改用控制器内手动调用:
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->header('Content-Type', 'application/json; charset=utf-8'); - 切勿混用:
json(json_encode($data))会导致双重编码,结果是字符串被再套一层引号,变成"{\"name\":\"张三\"}"
强制响应头为application/json; charset=utf-8
仅靠前端发Content-Type: application/json不能保证TP6返回JSON——框架会根据Accept头自动切换格式,容易误走HTML渲染流程。
- 统一用
return json($data, $code);结尾,不要依赖“发JSON请求就自动回JSON” - Postman或curl测试时,必须同时带上:
Accept: application/jsonContent-Type: application/json(注意:不要写application/json; charset=utf-8,某些TP6.0.x版本会因此跳过JSON解析) - 若用
response(),必须显式设头:response($data)->contentType('application/json')
验证数据源本身是合法UTF-8
即使JSON编码正确,若数据库、POST参数或外部接口传入的数据本身不是UTF-8,json_encode()会直接返回false,造成空响应或null。
- 数据库连接配置中确认:
'charset' => 'utf8mb4'(不能是utf8或留空) - MySQL服务端变量检查:
character_set_server和collation_server都应为utf8mb4_unicode_ci - 已有表字段若原为
utf8,需执行:ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 前端提交表单时,确保HTML页有
<meta charset="UTF-8">,且不使用GBK等旧编码提交
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










