json_encode() 输出中文为null或\uxxxx是因非utf-8编码或未启用json_unescaped_unicode;需确保数据utf-8、连接层设utf8mb4、设置header('content-type: application/json; charset=utf-8')。

PHP json_encode() 输出中文变成 null 或 \uXXXX
默认情况下,json_encode() 会把非 ASCII 字符(比如中文)转成 Unicode 转义序列,如 "\u4f60\u597d"。这不是乱码,是标准行为;但如果你要前端直接显示可读中文,就得让它不转义。
关键不是“修复乱码”,而是控制编码行为——PHP 5.4+ 支持 JSON_UNESCAPED_UNICODE 标志:
- 不加这个标志:中文变
"\u676e\u9614" - 加上它:
json_encode($data, JSON_UNESCAPED_UNICODE)→ 中文原样输出 - 注意:必须确保源数据是 UTF-8 编码,否则仍会返回
null
为什么 json_encode() 返回 null?
常见原因是输入数据含非 UTF-8 字符,比如 GBK 编码的字符串、数据库没设 UTF-8、或从文件/表单直接读入未转码。
排查步骤:
立即学习“PHP免费学习笔记(深入)”;
- 用
mb_detect_encoding($str, ['UTF-8', 'GB2312', 'BIG5'], true)检查字符串实际编码 - 确认 MySQL 连接层用了
SET NAMES utf8mb4(不只是utf8) - 读取文件时显式指定编码:
file_get_contents($path, false, stream_context_create(['http' => ['encoding' => 'utf-8']]))不生效,得用mb_convert_encoding(file_get_contents($path), 'UTF-8', 'GBK') -
json_last_error_msg()会明确告诉你是不是 “Malformed UTF-8 characters”
PHP 7.4+ 使用 json_encode() 处理关联数组和对象的区别
中文本身不区分类型,但结构影响输出结果是否符合预期:
- 关联数组(键为字符串)→ 编码为 JSON 对象:
{"name":"张三"} - 索引数组(连续数字键)→ 编码为 JSON 数组:
["张三","李四"] - 对象属性含中文 → 只要属性名和值都是 UTF-8,加
JSON_UNESCAPED_UNICODE即可正常 - 注意:如果对象有不可见字符(如 BOM)、或 __toString() 返回非 UTF-8 字符串,也会导致
null
header 和输出前的编码陷阱
即使 json_encode() 正确输出了中文,浏览器仍可能显示乱码,原因在 HTTP 响应头或输出缓冲:
- 必须设置
header('Content-Type: application/json; charset=utf-8');,不能只靠 meta 标签 - 检查有没有意外输出:比如文件开头有 BOM、
echo或 warning 前就调用了json_encode(),会导致 header 发送失败 - 用
ob_start()+ob_clean()清掉前置输出,再发 header 和 JSON - Apache 的
AddDefaultCharset或 Nginx 的charset配置若设为 GBK,会覆盖 PHP header
json_encode() 一个函数。











