Unicode转义序列解码异常求助:Ñ无法解析为Ñ
问题原因:黑盒系统的编码错误,而非函数使用问题
先给你拍板:这锅得黑盒系统背,你用json_decode()的方式完全没问题。下面给你掰明白为啥会出现这种乱码,以及怎么解决:
为啥会变成Ñ?
先搞懂Ñ的正确编码逻辑:
Ñ对应的Unicode码点是U+00D1,所以在JSON里正确的转义写法应该是\u00d1;- 如果直接用UTF-8编码
Ñ,得到的字节是0xC3 0x91。
你的黑盒系统明显在编码时搞反了逻辑:它没有直接把Ñ转成\u00d1,而是先把Ñ转成了UTF-8字节0xC3 0x91,然后又把这两个字节分别当作独立的Unicode字符转成了转义序列——而且还转错了,把0x91写成了0x2018(对应左单引号‘),所以最终输出了\u00c3\u2018。
当json_decode()解析这段内容时,会老老实实把\u00c3解析成Ã,\u2018解析成‘,拼起来自然就是你看到的Ñ了。
临时补救办法(改不了黑盒的话)
如果暂时没法让黑盒修复输出,你可以在PHP里手动修正:
方法一:替换错误的转义序列再解析
<?php $json = '{"AR_DESCRI":"LIMA CENTIMETRADA\/FORMAS U\u00c3\u2018AS 100\/180 MANI."}'; // 把错误的转义串直接换成正确的Ñ的Unicode转义 $fixedJson = str_replace('\u00c3\u2018', '\u00d1', $json); $obj = json_decode($fixedJson); print_r($obj); // 输出:stdClass Object ( [AR_DESCRI] => LIMA CENTIMETRADA/FORMAS UÑAS 100/180 MANI. ) ?>
方法二:解析后修复字符串
<?php $json = '{"AR_DESCRI":"LIMA CENTIMETRADA\/FORMAS U\u00c3\u2018AS 100\/180 MANI."}'; $obj = json_decode($json); // 先把解析后的字符串从UTF-8转成ISO-8859-1,再转回UTF-8修复编码错位,最后替换错误的单引号 $fixedStr = mb_convert_encoding($obj->AR_DESCRI, 'UTF-8', 'ISO-8859-1'); $fixedStr = str_replace('‘', 'Ñ', $fixedStr); echo $fixedStr; // 输出:LIMA CENTIMETRADA/FORMAS UÑAS 100/180 MANI. ?>
根本解决思路
最靠谱的还是让黑盒系统改输出逻辑:要么直接把特殊字符转成对应的Unicode转义(比如Ñ转成\u00d1),要么直接输出UTF-8编码的JSON,不要对正常的UTF-8字节做多余的转义操作。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

