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

如果您在使用PHP的json_encode函数处理含中文的数据时,输出结果中中文显示为\uXXXX格式或直接返回null,则问题通常源于编码不一致或未启用关键选项。以下是解决此问题的步骤:
一、启用JSON_UNESCAPED_UNICODE选项
该选项自PHP 5.4起可用,作用是阻止json_encode将UTF-8中文字符自动转义为Unicode序列,使输出保持原始可读中文。前提是输入数据本身必须为合法UTF-8编码,否则仍会触发错误或返回false。
1、确认PHP版本不低于5.4,可通过PHP_VERSION常量验证。
2、构造待编码数组,确保键值均为UTF-8字符串,例如$data = ['用户' => '王五', '城市' => '深圳']。
立即学习“PHP免费学习笔记(深入)”;
3、调用json_encode($data, JSON_UNESCAPED_UNICODE)进行编码。
4、检查输出是否为{"用户":"王五","城市":"深圳"}而非{"用户":"\u738b\u4e94","城市":"\u6df1\u5733"}。
二、统一输入数据编码为UTF-8
json_encode仅接受UTF-8编码的字符串;若源数据来自数据库、文件或表单且非UTF-8(如GBK、ISO-8859-1),必须先转换。盲目使用utf8_encode()可能引发错误,应优先检测实际编码再处理。
1、使用mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5', 'ISO-8859-1'], true)判断字符串真实编码。
2、若检测结果为GBK且确认内容含中文,执行$utf8_str = mb_convert_encoding($str, 'UTF-8', 'GBK')。
3、若检测结果为ISO-8859-1,可安全使用$utf8_str = utf8_encode($str)。
4、将转换后的$utf8_str填入数组,再传入json_encode。
三、设置HTTP响应头并清除前置输出
即使json_encode输出正确中文,浏览器仍可能因响应头缺失或缓冲区污染导致显示异常。Content-Type头必须明确声明charset=utf-8,且需在任何输出前发送。
1、在调用json_encode前,执行header('Content-Type: application/json; charset=utf-8')。
2、检查PHP文件开头是否存在BOM字符或空白行,这些会导致header发送失败。
3、启用输出缓冲:ob_start()置于脚本最顶部,后续调用ob_clean()清除已缓存的非法输出,再发送header和JSON。
4、避免在header之前出现echo、print、警告或Notice信息。
四、验证并修复源文件编码格式
PHP脚本自身若保存为含BOM的UTF-8或ANSI编码,可能导致解析器读取到不可见字节,进而影响字符串字面量的编码判定,最终使json_encode接收非UTF-8输入。
1、使用VS Code、Notepad++或PhpStorm打开PHP文件。
2、在编辑器状态栏或编码菜单中确认当前编码显示为UTF-8 without BOM。
3、若显示为UTF-8 with BOM或GBK,选择“另存为”,强制指定编码为UTF-8 without BOM。
4、保存后重新运行脚本,观察json_encode输出是否恢复正常中文。
五、使用mb_convert_encoding进行强制编码归一化
当输入来源复杂、编码混杂或mb_detect_encoding无法准确识别时,可跳过检测步骤,直接对所有字符串执行强制转换。该方法牺牲部分精度但提升鲁棒性,适用于第三方API响应或老旧系统对接场景。
1、获取原始字符串变量$raw,无论其来源是$_POST、file_get_contents还是数据库查询结果。
2、执行$safe_utf8 = mb_convert_encoding($raw, 'UTF-8', 'UTF-8, GBK, BIG5, ISO-8859-1'),列表中按优先级排列可能编码。
3、将$safe_utf8写入待编码数组,确保整个数组结构中的字符串均为UTF-8。
4、调用json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)增强兼容性。
六、检查json_last_error并定位根本原因
当json_encode返回false而非字符串时,必须通过json_last_error()和json_last_error_msg()获取精确错误类型。常见错误中,JSON_ERROR_UTF8明确指向非法UTF-8字符,而JSON_ERROR_DEPTH或JSON_ERROR_STATE_MISMATCH则提示结构异常。
1、执行$json = json_encode($data, JSON_UNESCAPED_UNICODE)后立即检查if ($json === false)。
2、调用$error = json_last_error_msg()获取人类可读错误信息。
3、若返回"Malformed UTF-8 characters",说明某字段含BOM、控制字符或截断字节,需逐字段用mb_check_encoding($value, 'UTF-8')筛查。
4、对不合规字段使用mb_substr($value, 0, mb_strlen($value, 'UTF-8'), 'UTF-8')截取有效长度,或用mb_convert_encoding($value, 'UTF-8', 'UTF-8')清理。



















