今天我在寫一個JS腳本的時候又出現了BOM事故。
我在頁面中插入一個外部JS,然後裡面有這樣一句話$.getJSON(“/my/newmsg”,function(data){alert(data);});其它浏覽器都能正常的彈出內容,唯獨IE下沒動靜,我郁悶了近一個小時,我懷疑這句話寫錯了懷疑JSON數據格式錯了懷疑我人品有問題…
後來我懷疑編碼不對,於是就看到了可惡的BOM打了勾,把它一去掉神跡就從烏雲底下冒了出來。
雖然我懶惰很少更新博客,但不得不上來記錄一下這個事,因為真是太意外了,JS也會因為BOM引發事故 – -|
Unicode規范中有一個BOM的概念。
BOM是Byte Order Mark的簡寫,就是字節序標記,這個東西在普通文本編輯器下是看不到的,可以說它是文件頭嗎?在二進制編輯器下才可以看到?可能是這樣。
在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。
UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。Windows就是使用BOM來標記文本文件的編碼方式的。