无忧站长 >

php json_decode 解码失败

2019-11-01 14:45:28 

案例:

今日批量导入游戏, 从别人接口拉去的字符串json_decode总是失败, 但是把log里面记录的解码失败的字符串copy出来单独解析,却可以成功. 排除了是字符编码的问题后, 还是不行, 百思不得其解.

只好二进制对比, 把接收到buf和我打印到log对比, 发现还真存在一些差异

分析:

一个一个字节对比, 发现从第373个字节开始不匹配. 一个是9=> , 一个是32对应空格.
373 not equal, org:9 , new:32 , 原来, 如果字符串中含有 字符, 就会解码失败.

而我log里面记录的字符串, 我在copy字符串到其他地方解析时, 自动被转换为了空格. 怪不得.

总结:

json 编解码 json_decode json_encode失败

1) 对于php json_decode失败, 原因可能是

a) 输入的字符串不是utf-8的, 可以用 mb_detect_encoding 检测出字符串的编码类型.
解决:如果不是utf-8, 可以使用iconv转换. utf8_encode函数慎用! 其总是认为输入字符串为ISO-8859-1编码的!!.

b) 输入字符串中含有 回车等隐藏的不可见字符.

eg对于如下字符串会解码失败:

$str = "{"ret ": 0}"; 去掉 则可以解码成功

解决: $str = strtr($str, " ", ' '); 把 都替换成空格.

最近做的一个项目,前三个字符不知道是什么,去掉就行了。