PHP中json_decode处理带重音字符失效问题求助
首先得明确:json_decode失败时不会主动报错,只会返回null,所以咱们第一步得先揪出具体的错误原因,这是破局的关键!
第一步:先查json_decode的错误详情
赶紧在代码里加上错误检查逻辑,看看到底是啥问题导致解码失败:
$arr = json_decode($array, true); if (json_last_error() !== JSON_ERROR_NONE) { echo 'JSON解码错误:' . json_last_error_msg(); } print_r($arr);
比如如果输出JSON解码错误:Malformed UTF-8 characters, possibly incorrectly encoded,那就是你的JSON字符串编码出问题了。
第二步:确保JSON字符串是纯UTF-8编码
你用json_encode($array, JSON_UNESCAPED_UNICODE)生成的确实是UTF-8格式,但如果保存到文件、传输过程中被转码(比如不小心存成了GBK),json_decode直接就罢工了。可以先检测并转码:
// 先检测当前字符串的编码 $currentEncoding = mb_detect_encoding($array, ['UTF-8', 'GBK', 'ISO-8859-1'], true); // 如果不是UTF-8,强制转码 if ($currentEncoding !== 'UTF-8') { $array = mb_convert_encoding($array, 'UTF-8', $currentEncoding); } // 再尝试解码 $arr = json_decode($array, true); print_r($arr);
注意mb_detect_encoding第三个参数设为true,能避免编码误判的情况。
第三步:检查JSON本身的语法是否合法
有时候重音字符没问题,但JSON可能藏着语法错误——比如末尾多了逗号、引号不配对、特殊字符没转义。你可以把生成的JSON字符串复制到浏览器控制台,用JSON.parse("你的JSON字符串")测试,或者直接看你的JSON是不是类似这种正确格式:
["üna"]
如果语法校验不通过,得回头检查json_encode之前的数组有没有特殊字符导致JSON格式崩坏。
第四步:别踩参数误区!
你提到给json_decode加了JSON_UNESCAPED_UNICODE——这个参数只属于json_encode,json_decode根本不认识它,加了不仅没用,反而可能出问题,赶紧删掉这个多余的参数!
最后:确保页面输出的编码一致性
虽然你加了UTF-8响应头,但也要确认你的PHP文件本身是UTF-8无BOM编码(有些编辑器默认存成带BOM的UTF-8,会悄悄搞乱输出)。另外输出时明确指定编码:
header('Content-Type: text/html; charset=utf-8'); $arr = json_decode($array, true); print_r($arr);
按上面的步骤一步步排查,大概率能解决问题——多数情况都是JSON编码不对或者藏着语法小错误。
内容的提问来源于stack exchange,提问作者Brendan Mullan

