1. 程式人生 > >遇到一個json解碼失敗的問題

遇到一個json解碼失敗的問題

二進制 str bsp 編解碼 批量 icon 遊戲 encoding iso

今日批量導入遊戲, 從別人接口拉去的字符串json_decode總是失敗, 但是把log裏面記錄的解碼失敗的字符串copy出來單獨解析,卻可以成功. 排除了是字符編碼的問題後, 還是不行, 百思不得其解.

只好二進制對比, 把接收到buf和我打印到log對比, 發現還真存在一些差異

分析:
一個一個字節對比, 發現從第373個字節開始不匹配. 一個是9=>\t, 一個是32對應空格.
373 not equal, org:9 , new:32 , 原來, 如果字符串中含有\t字符, 就會解碼失敗.

而我log裏面記錄的字符串, 我在copy字符串到其他地方解析時, \t自動被轉換為了空格.

總結:
json 編解碼 json_decode json_encode失敗
1) 對於php json_decode失敗, 原因可能是
a) 輸入的字符串不是utf-8的, 可以用 mb_detect_encoding 檢測出字符串的編碼類型.
解決:如果不是utf-8, 可以使用iconv轉換. utf8_encode函數慎用! 其總是認為輸入字符串為ISO-8859-1編碼的!!.
b) 輸入字符串中含有 \t回車等隱藏的不可見字符.
eg對於如下字符串會解碼失敗:
$str = "{\"ret\t\": 0}"; 去掉\t則可以解碼成功
解決: $str = strtr($str, "\t", ‘ ‘); 把\t都替換成空格.

遇到一個json解碼失敗的問題