加 json_unescaped_unicode 可输出中文而非uxxxx,但需确保数据为utf-8编码、php≥5.4、文件无bom、数据库连接设utf8mb4,并正确设置content-type响应头。

直接加 JSON_UNESCAPED_UNICODE 就能解决,但前提是数据本身是 UTF-8 编码,否则 json_encode() 会返回 false 或乱码。
为什么中文总被转成 uXXXX
这是 json_encode() 的默认行为——它把所有非 ASCII 字符(包括中文)转义为 Unicode 序列,目的是兼容老环境。不是 bug,是保守设计。但调试日志、Postman 查看、前端 console.log 都很不友好。
- 不加标志:
json_encode(['name' => '张三'])→{"name":"u5f20u4e09"} - 加了标志:
json_encode(['name' => '张三'], JSON_UNESCAPED_UNICODE)→{"name":"张三"} - PHP 版本必须 ≥ 5.4,低于这个版本该常量不存在,会报错或静默忽略
数据不是 UTF-8 编码时会直接失败
json_encode() 要求所有字符串输入必须是合法 UTF-8 字节流。如果源数据来自 GBK 数据库、ISO-8859-1 表单、或带 BOM 的文件,json_encode() 可能返回 false,或者输出空字符串、乱码,甚至截断后续字段。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)检查原始字符串编码 - 确认非 UTF-8 后,用
mb_convert_encoding($str, 'UTF-8', 'GBK')转换,别盲目套utf8_encode()(它只适用于 ISO-8859-1) - PHP 文件自身也得是 UTF-8 无 BOM:VS Code / PhpStorm 右下角点编码 → “Save with Encoding” → 选 UTF-8 without BOM
- 数据库连接层要设
charset=utf8mb4,PDO DSN 加;charset=utf8mb4,MySQLi 用$mysqli->set_charset('utf8mb4')
TP6 框架里不能只靠 json() 方法
ThinkPHP 6 默认的 json($data) 响应不启用 JSON_UNESCAPED_UNICODE,且响应头可能被 Accept 头干扰,导致走 HTML 渲染分支。
- TP6.1+:在
config/app.php中配'json_encode' => [ JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ] - TP6.0:不支持该配置,必须手动写
return response(json_encode($data, JSON_UNESCAPED_UNICODE))->contentType('application/json'); - 绝对不要
json(json_encode(...))—— 这会导致双重 JSON 编码,结果变成"{"name":"\u5f20\u4e09"}" - Postman 测试时,
Accept: application/json必须带上;Content-Type写application/json,不要加; charset=utf-8(某些 TP6.0.x 版本会因此跳过 JSON 解析)
输出前漏设 header 是常见盲区
即使 json_encode() 输出了正确中文,浏览器或 curl 仍可能按 ISO-8859-1 解析,显示为乱码。这不是 JSON 问题,是 HTTP 协议层缺失声明。
- 纯 PHP 脚本:输出前加
header('Content-Type: application/json; charset=utf-8'); - TP6 中用
response()->contentType('application/json'),它内部会自动加charset=utf-8 - 注意:Nginx/Apache 的默认字符集配置可能覆盖 PHP header,需检查是否禁用了
add_header或存在冲突的charset指令
最容易被忽略的是:mb_convert_encoding() 转码后没验证结果是否真变 UTF-8,以及框架响应头和手动 json_encode() 混用导致的双重编码。建议每次改完立刻用 var_dump(json_last_error_msg()) 和 bin2hex() 看原始字节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










