php 8.3 中 json_encode() 默认转义中文,需显式传入 json_unescaped_unicode 标志并确保输入为 utf-8 编码,才能输出原始中文字符。

在 PHP 8.3 中,json_encode() 默认仍会将中文转义为 \uXXXX 形式。要让中文以原始字符(如 "你好")输出,关键就一个:必须显式传入 JSON_UNESCAPED_UNICODE 标志。
这个常量自 PHP 5.4.0 起可用,PHP 8.3 完全支持,且是官方推荐、最稳妥的方式。
确保输入数据是 UTF-8 编码json_encode() 要求所有字符串必须是 UTF-8 编码,否则即使加了标志也可能出错或返回 false。常见来源需检查:
- 数据库查询结果:确认连接字符集为
utf8mb4,并设置 PDO/MySQLi 的 charset; - 文件读取内容:用
mb_convert_encoding($str, 'UTF-8', 'GBK')或iconv('GBK', 'UTF-8//IGNORE', $str)转换; - 表单或 API 请求参数:确保前端发送时声明
Content-Type: application/json; charset=utf-8,PHP 接收后不额外转码; - PHP 源文件本身:保存为 UTF-8 无 BOM 格式,避免脚本内硬编码的中文被解析异常。
正确调用方式
直接传入第二个参数即可:
$data = ['msg' => '你好,世界', 'city' => '上海'];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// 输出:{"msg":"你好,世界","city":"上海"}
如需格式化输出(便于调试),可叠加其他标志:
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)
不要用这些方法“曲线救国”
- 避免
str_replace()或正则替换\u序列:容易破坏 JSON 结构,比如误改 URL 中的合法\u; - 不要用
utf8_encode()盲目套用:它只适用于 ISO-8859-1 输入,对 GBK 或 UTF-8 字符串会二次编码导致乱码; - 不依赖
header('Content-Type: application/json; charset=utf-8')来“修复”转义:该 header 只影响浏览器解码方式,不改变json_encode()输出的内容本身。
PHP 8.3 对编码处理更严格,但逻辑没变——UTF-8 输入 + JSON_UNESCAPED_UNICODE 标志 = 原始中文输出。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











