案例:
今日批量导入游戏, 从别人接口拉去的字符串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, " ", ' '); 把 都替换成空格.
最近做的一个项目,前三个字符不知道是什么,去掉就行了。