json_error_utf8 表示输入含非法utf-8字符,常见于gbk/iso-8859-1等非utf-8编码未转码直接传入json_encode(),需用mb_convert_encoding转为utf-8或mb_detect_encoding识别后处理。

JSON_ERROR_UTF8 表示 PHP 在处理 JSON 数据时遇到了**非法或损坏的 UTF-8 字符**,导致 json_encode() 或 json_decode() 操作失败。
为什么会触发这个错误
PHP 的 JSON 函数严格要求所有字符串必须是合法 UTF-8 编码。一旦输入中混入了非 UTF-8 字节序列(比如 GBK、ISO-8859-1、Windows-1252 编码的中文或特殊符号),就会报此错。
- 数据库字段用的是 GBK,但没转码就直接传给
json_encode() - 用户提交的表单含复制粘贴来的“智能引号”(如 “ ” 或 ’ ’),它们在非 UTF-8 环境下不是标准 UTF-8 字节
- 文件读取时未指定编码,读出的字符串实际是 Latin-1 或其他编码
- 旧系统生成的数据含控制字符或截断的多字节 UTF-8 序列(比如只取了汉字 UTF-8 的前两个字节)
怎么确认是不是这个错误
调用完 json_encode() 或 json_decode() 后,立即检查:
$result = json_encode($data, JSON_UNESCAPED_UNICODE);
if ($result === false) {
$error = json_last_error();
$msg = json_last_error_msg();
if ($error === JSON_ERROR_UTF8) {
echo "UTF-8 编码问题:", $msg; // 输出类似 "Malformed UTF-8 characters"
}
}
常见修复方式
-
统一转为 UTF-8:对可疑字符串用
mb_convert_encoding($str, 'UTF-8', 'auto')或明确指定源编码(如'GBK') -
过滤非法字节:用
mb_convert_encoding($str, 'UTF-8', 'UTF-8')可自动剔除或替换非法序列(需配合mb_substitute_character('none')) -
提前检测编码:用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)判断真实编码再处理 - 避免盲目 utf8_encode():该函数只适用于 ISO-8859-1 输入,误用于 GBK 会雪上加霜
额外提醒
这个错误在低版本 PHP(如 5.3.2)中可能不返回 JSON_ERROR_UTF8 常量,而是表现为 JSON_ERROR_NONE 却返回 false——此时更要优先怀疑编码问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











