应启用json_unescaped_unicode选项并确保输入为utf-8编码,统一源数据、脚本文件及http响应头的utf-8设置,配合mb_convert_encoding强制归一化和json_last_error精准排错。

PHP数组转JSON出现乱码,通常是因为中文字符未正确编码为UTF-8,而json_encode()默认要求输入字符串必须是UTF-8编码。直接加AI提示或“加编码参数”并不能解决问题——PHP本身没有叫“AI编码参数”的东西,关键在于确保数据源头和处理过程全程使用UTF-8。
确认数组中的字符串已是UTF-8编码
如果原始数据来自数据库、文件或用户输入,很可能不是UTF-8。例如MySQL查询结果若连接未设UTF-8,中文会变成乱码再传给json_encode(),此时编码已损坏,无法补救。
- 数据库连接层:PDO需设置
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4";MySQLi用$mysqli->set_charset("utf8mb4") - 读取文件时:用
file_get_contents()拿到内容后,可用mb_detect_encoding()检查,必要时用mb_convert_encoding($str, 'UTF-8', 'GB2312')转换(常见于Windows本地文件) - 用户POST数据:确保HTML表单声明
<meta charset="UTF-8">,且HTTP请求头中Content-Type含charset=utf-8
使用json_encode()的正确姿势
json_encode()本身不负责编码转换,只校验并输出UTF-8。它有几个实用选项可提升健壮性:
-
JSON_UNESCAPED_UNICODE:避免中文被转成\uXXXX,让JSON更可读(但不影响解析) -
JSON_INVALID_UTF8_SUBSTITUTE:将非法UTF-8字节替换为,防止整个编码失败(PHP 7.2+) - 组合使用:
json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE)
终极兜底:递归转码函数(慎用)
当无法控制上游数据编码,又必须快速修复时,可对数组做递归UTF-8转换。但这是权宜之计,应优先修复源头。
示例函数:
function to_utf8_recursive($data) {if (is_string($data)) {
return mb_convert_encoding($data, 'UTF-8', 'UTF-8, GBK, GB2312, BIG5');
} elseif (is_array($data)) {
return array_map('to_utf8_recursive', $data);
} else {
return $data;
}
}
然后调用:json_encode(to_utf8_recursive($arr), JSON_UNESCAPED_UNICODE)
验证与调试小技巧
别只看浏览器显示,用命令行或工具确认真实输出:
- 在PHP中用
bin2hex(json_encode(...))查看十六进制,UTF-8中文通常是3字节序列(如e4b8ad对应“中”) - 用
json_last_error()和json_last_error_msg()捕获具体错误(如JSON_ERROR_UTF8说明有非法UTF-8) - Chrome开发者工具Network面板查看Response Headers是否含
Content-Type: application/json; charset=utf-8
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











