关键是要启用json_unescaped_unicode选项并确保输入为合法utf-8字符串,同时php文件、响应头及数据库均需统一为utf-8编码,缺一不可。

PHP 8 中让 json_encode 输出中文不乱码、不转义为 \uXXXX,关键不是“兼容旧写法”,而是确保整个链路符合 UTF-8 规范,并正确启用现代选项。PHP 8 默认已全面支持 UTF-8,但乱码仍常出现——问题几乎都出在数据源头或环境配置,而非函数本身。
必须启用 JSON_UNESCAPED_UNICODE
这是最直接有效的开关。PHP 5.4+ 已支持,PHP 8 更是稳定可靠:
-
不要只写
json_encode($data)—— 默认会把中文转成"\u738b\u4e94" -
务必加上标志:
json_encode($data, JSON_UNESCAPED_UNICODE) - 可叠加常用优化项,如
JSON_UNESCAPED_SLASHES防止斜杠转义:json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
输入数据必须是合法 UTF-8 字符串
json_encode 严格要求所有字符串值为 UTF-8 编码,否则返回 false 或静默截断。常见非 UTF-8 来源包括数据库(GBK)、表单提交(ISO-8859-1)、Excel 导入文本等:
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5', 'ISO-8859-1'], true)检测真实编码 - 确认是 GBK:用
mb_convert_encoding($str, 'UTF-8', 'GBK') - 确认是 ISO-8859-1:可用
utf8_encode($str)(仅限该编码) - 避免盲目套
utf8_encode()——对 GBK 数据调用会导致双编码乱码
PHP 文件与响应头也要 UTF-8 对齐
即使 json_encode 输出了正确中文,浏览器或前端仍可能显示乱码,原因常在输出环境:
- PHP 脚本文件本身保存为 UTF-8 无 BOM(VS Code / PhpStorm 右下角设置)
- 发送 JSON 前必须设置响应头:
header('Content-Type: application/json; charset=utf-8'); - 该
header()必须在任何输出(echo、空白行、BOM、Notice)之前调用 - 推荐加
ob_start()开头 +ob_clean()清除前置污染,再发 header 和 JSON
数据库与框架需同步设 utf8mb4
若数据来自 MySQL,仅 PHP 层处理不够:
- PDO 连接 DSN 中加
;charset=utf8mb4 - MySQLi 连接后立即执行
$mysqli->set_charset('utf8mb4') - 表字段字符集设为
utf8mb4,排序规则用utf8mb4_unicode_ci或utf8mb4_0900_ai_ci - Laravel / ThinkPHP 等框架需检查配置,TP6.1+ 可在
config/app.php中配'json_encode' => JSON_UNESCAPED_UNICODE
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











