php默认将中文转义为uxxxx,添加json_unescaped_unicode选项即可输出原始中文,但需确保php≥5.4且数据为utf-8编码。

PHP 的 json_encode 默认会对中文字符进行 Unicode 转义(如 "u4f60u597d"),这是为了确保 JSON 字符串在各种环境下的兼容性。但如果你希望输出可读的原始中文(如 "你好"),可以通过添加 JSON_UNESCAPED_UNICODE 选项来关闭转义。
使用 JSON_UNESCAPED_UNICODE 选项
这是最直接、推荐的方式。该常量告诉 json_encode 不要将多字节 UTF-8 字符(包括中文)转义为 uXXXX 形式:
- PHP 5.4.0 及以上版本支持该常量
- 必须确保传入的数据是 UTF-8 编码,否则可能出错或显示乱码
- 可以与其他 JSON 选项组合使用,例如
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
示例:
$data = ['name' => '张三', 'msg' => '你好,世界!'];
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $json;
// 输出:{"name":"张三","msg":"你好,世界!"}
?>
检查并确保输入数据是 UTF-8 编码
即使加了 JSON_UNESCAPED_UNICODE,如果原始字符串不是 UTF-8 编码,结果仍可能异常(如乱码或转义失败):
- 数据库连接需设为 UTF-8(如 MySQL 使用
SET NAMES utf8mb4或 PDO DSN 中指定charset=utf8mb4) - PHP 文件本身应保存为 UTF-8 无 BOM 格式
- 从 GET/POST 或文件读取的字符串,可用
mb_convert_encoding($str, 'UTF-8', 'GBK')做转换(根据实际源编码调整)
兼容旧版 PHP(低于 5.4.0)的替代方案
若无法升级 PHP,可借助 preg_replace 对已生成的 JSON 进行后处理(不推荐,仅作兜底):
- 先用
json_encode得到含uXXXX的字符串 - 用正则匹配 Unicode 码点并还原为 UTF-8 字符,例如:
preg_replace_callback('/\\u([0-9a-f]{4})/i', function ($m) { return mb_convert_encoding(pack('H*', $m[1]), 'UTF-8', 'UCS-2BE'); }, $json); - 注意:此方法有性能开销,且对混合编码或非法码点容错性差
常见误区提醒
有些开发者尝试用 urldecode、iconv 或手动替换 u,这些方式大多无效或引发新问题:
-
JSON_UNESCAPED_UNICODE是唯一官方、安全、高效的解决方案 - 不要在
json_encode后再用stripslashes或类似函数——它不会还原 Unicode 转义,反而可能破坏合法反斜杠 - 浏览器或调试工具显示
uXXXX并不意味着数据错误,JSON 解析器会自动还原,只是可读性差
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











