必须启用JSON_UNESCAPED_UNICODE选项且确保PHP≥5.4、输入数据为UTF-8编码,否则仍会输出\uXXXX或返回false;中文默认转义是json_encode的兼容性设计,并非bug。

直接加 JSON_UNESCAPED_UNICODE 就行,前提是 PHP ≥ 5.4 且数据本身是 UTF-8 编码——不满足任一条件,加了也无效,甚至返回 false。
为什么中文默认变成 \uXXXX?
这不是 bug,是 json_encode 的默认行为:所有非 ASCII 字符(包括中文)都会被转义为 \uXXXX 形式。标准 JSON 允许这么干,但前端读起来不直观,某些旧客户端(比如早期 iOS WebView)还可能解析失败。
关键点在于:这和“乱码”无关,而是编码策略选择问题。你不是在“修复错误”,而是在显式告诉 PHP “别转义中文”。
必须用 JSON_UNESCAPED_UNICODE 吗?
是的,这是最干净、最可靠的方式。其他方案(如先 urlencode 再 urldecode)会污染数据结构、增加出错概率,且无法处理嵌套数组或对象中的中文字段。
立即学习“PHP免费学习笔记(深入)”;
-
json_encode($data, JSON_UNESCAPED_UNICODE)—— 正确写法 -
json_encode($data, json_unescaped_unicode)—— 错误:常量名大小写敏感,PHP 不认这个写法 -
json_option(JSON_UNESCAPED_UNICODE)—— 不存在该函数,纯属误导
加了还是输出 null 或 \uXXXX?检查这三件事
常见失败不是选项没生效,而是底层编码链断裂:
- 输入数据不是 UTF-8:比如从数据库读出来的是
gbk,或文件保存为 ANSI 编码,json_encode会直接返回false(注意不是报错,是静默失败) - MySQL 连接没设
utf8mb4:即使表字符集是utf8mb4,连接层仍是latin1,查出来的数据就是乱码 - HTTP 响应头缺失:
header('Content-Type: application/json; charset=utf-8')没设置,浏览器可能按 ISO-8859-1 解析,显示方块
真正容易被忽略的,是数据源头的编码一致性——从 DB 连接、PHP 文件保存格式、到 HTTP 响应头,任何一个环节掉链子,JSON_UNESCAPED_UNICODE 都救不回来。



















