thinkphp json中文被转义不是bug,是php原生json_encode()默认行为;必须显式传入json_unescaped_unicode常量才能显示原样中文,tp6.1+可全局配置,tp6.0需手动逐处添加,并确保数据库、文件、请求体均为utf-8编码。

ThinkPHP JSON 中文被转义不是 bug,是 PHP 原生 json_encode() 的默认行为——只要没显式传 JSON_UNESCAPED_UNICODE,中文就一定会变成 \u4f60\u597d 这种形式。
为什么 json() 默认不显示中文原样?
ThinkPHP 的 json() 助手函数底层直接调用 json_encode($data),不带任何标志位。PHP 自 5.4 起才支持 JSON_UNESCAPED_UNICODE,但为了向后兼容和“标准 JSON 安全性”,默认仍启用 Unicode 转义。
-
json_encode(['name' => '张三'])→{"name":"\u5f20\u4e09"} -
json_encode(['name' => '张三'], JSON_UNESCAPED_UNICODE)→{"name":"张三"} - TP6.0 不支持全局配置,必须每个
json()调用都手动加参数 - TP6.1+ 才能在
config/app.php里统一配'json_encode' => [JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES]
加了 JSON_UNESCAPED_UNICODE 还是乱码?检查这三处
即使传了 JSON_UNESCAPED_UNICODE,输出仍是问号、方块或空字符串,问题一定出在数据源头或传输链路上:
- 数据库连接没设
'charset' => 'utf8mb4',查出来的字段本身就是乱码(如显示“寮笁”),再怎么 encode 都救不回来 - PHP 文件含 BOM(EF BB BF),导致
json()前已有不可见输出,JSON 格式损坏,浏览器报Unexpected token in JSON at position 0 - 前端用 GBK 提交表单,TP6 默认按 UTF-8 解析
php://input,原始字节丢失,后续所有处理都基于错误输入
response()->json() 和 json() 别混用
response()->json($data) 是响应对象,会立即结束请求;json($data) 是纯字符串生成工具,可用于日志、缓存等非响应场景。两者行为不同,不能互相替代:
- 写成
return response()->json(json_encode($data, JSON_UNESCAPED_UNICODE))→ 双重编码,结果是"{\"name\":\"张三\"}"(带额外引号和转义) - 想统一控制响应头,应该用
return json($data, 200)->header('Content-Type', 'application/json; charset=utf-8') - 中间件里不要用
response()->json()拦截并重写响应体——它会跳过后续中间件和控制器逻辑
真正难排查的不是怎么加标志位,而是当 json_encode() 返回 false 或空字符串时,你得意识到:数据本身可能已经不是 UTF-8,而这个判断点往往藏在数据库连接、文件读取、外部 API 响应这些上游环节里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











