淺談chr(239) . chr(187) . chr(191)的作用


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頭

 

 

如大神發現敘述有錯,請評論反饋,小的立即更改哈~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM