json_encode默认转义中文是因rfc 7159要求ascii安全,php 5.4+可用json_unescaped_unicode避免;需确保utf-8编码、正确响应头及存储环境,否则仍可能乱码。

json_encode 默认会把中文转成 uXXXX 形式,这不是 bug,是 RFC 7159 允许的行为,但多数 Web API 和前端调试时更希望看到原生中文字符。
为什么 json_encode 默认转义中文
PHP 的 json_encode 在早期版本(JSON_UNESCAPED_UNICODE 的反向逻辑——即“不特别声明就不放行中文”。它把非 ASCII 字符统一转义,是为了兼容只支持 ASCII 的旧系统或传输通道。现在绝大多数场景已无需这种保守策略。
PHP 5.4+ 正确解法:加 JSON_UNESCAPED_UNICODE
只需在第二个参数中传入该常量,中文就会以 UTF-8 原样输出:
echo json_encode(['name' => '张三', 'city' => '深圳'], JSON_UNESCAPED_UNICODE);
输出:{"name":"张三","city":"深圳"}
- 必须确保 PHP 版本 ≥ 5.4.0,否则该常量未定义
- 数组/对象中的字符串必须是合法 UTF-8 编码,否则会返回
false - 如果混用其他 flag(如
JSON_PRETTY_PRINT),用|拼接即可:JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT
PHP 5.3 或更老版本的兼容方案
没有 JSON_UNESCAPED_UNICODE?别硬升版本,用 preg_replace 临时解码 Unicode 转义序列:
$json = json_encode(['name' => '张三']);
$json = preg_replace_callback('/\\u([0-9a-fA-F]{4})/', function ($matches) {
return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UCS-2BE');
}, $json);
注意:
- 这属于兜底手段,性能略低,且无法修复
json_encode因编码错误返回false的情况 - 若原始字符串含真实反斜杠(如路径
"C:\temp"),此正则可能误伤,慎用于不可控输入 - 强烈建议优先升级 PHP,5.3 已停止维护超十年
常见踩坑点:header、MySQL、文件写入都可能二次破坏中文
json_encode 输出正常 ≠ 最终看到中文。下面这些环节经常悄悄搞乱:
- HTTP 响应头没设
Content-Type: application/json; charset=utf-8,浏览器或 curl 可能按 ISO-8859-1 解析 - MySQL 字段用
latin1存储 JSON 字符串,插入时中文变??? - 写入文件没指定
fopen(..., 'wb')或没用mb_internal_encoding('UTF-8'),文件保存为 ANSI 编码 - Apache/Nginx 配置了默认
AddDefaultCharset ISO-8859-1,会覆盖你写的 header
真正让中文“稳稳出现”,得从 json_encode 开始,一路盯到终端显示,中间任何一环掉链子都不行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











