chr(239) . chr(187) . chr(191)
作為一名初學者,偶爾在代碼中發現這么一段代碼:
json_decode(trim($param, chr(239) . chr(187) . chr(191)), true);
那么到底有什么用了,因此我在網上查閱了大量資料。
相信新手都遇到這么一個bug,就是接口傳回了json字符串數據,但是用json_decode()轉碼的時候發現,數據為NULL。
原因就是UTF-8的BOM頭的影響.
BOM是什么
Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。在UCS 編碼中有一個叫做 "Zero Width No-Break Space",中文譯名作“零寬無間斷間隔”的字符,它的編碼是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不應該出現在實際傳輸中。UCS 規范建議我們在傳輸字節流前,先傳輸字符 "Zero Width No-Break Space"。這樣如果接收者收到 FEFF,就表明這個字節流是 Big-Endian 的;如果收到FFFE,就表明這個字節流是 Little- Endian 的。因此字符 "Zero Width No-Break Space" (“零寬無間斷間隔”)又被稱作 BOM(即Byte Order Mark)。
UTF-8 BOM頭又是什么
UTF-8以字節為編碼單元因此不需要 BOM 來表明字節順序,但可以用 BOM 來表明編碼方式。字符 "Zero Width No-Break Space" 的 UTF-8 編碼是 EF BB BF。所以如果接收者收到以 EF BB BF 開頭的字節流,就知道這是 UTF-8編碼了。
chr(239) . chr(187) . chr(191)拼接成utf-8 bom頭,再使用trim函數即可
trim($param, chr(239) . chr(187) . chr(191))
去除utf-8 的bom頭還有其他方法,以下是另一種方法:
if(preg_match('/^\xEF\xBB\xBF/',$json_data)){ $json_data = substr($info,3); } $json_data= json_decode(trim($json_data),true);
匹配是否存在bom頭,存在則截掉前三位字符,即bom頭
如大神發現敘述有錯,請評論反饋,小的立即更改哈~~