BOM——Byte Order Mark,就是字節序標記
在UCS 編碼中有一個叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。
UCS規范建議我們在傳輸字節流前,先傳輸 字符”ZERO WIDTH NO-BREAK SPACE“。
如果接收者收到FEFF,就表明這個字節流是大字節序的;如果收到FFFE,就表明這個字節流是小字節序的。因此字符”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編碼了。
在utf-8編碼文件中BOM在文件頭部,占用三個字節,用來標識該文件屬於utf-8編碼,現在已經有很多軟件識別BOM頭,但還是有些不能識別BOM頭,比如PHP就不能識別BOM頭,這也就是用記事本編輯utf-8編碼的PHP文件后,就會報錯的原因。
在windows環境下,用記事本打開任何一個文本文件,另存為utf-8格式后,這樣文件就自動被加上了BOM頭信息。可以很明顯的看出,含BOM頭的文件多出三個字節 efbbbf。notepad++會自動添加為帶Bom的utf8。
拓展資料:
UTF-8
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼,由Ken Thompson於1992年創建。現在已經標准化為RFC 3629。UTF-8用1到6個字節編碼Unicode字符。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
優缺點:
優點
UTF-8編碼可以通過屏蔽位和移位操作快速讀寫。字符串比較時strcmp()和wcscmp()的返回結果相同,因此使排序變得更加容易。字節FF和FE在UTF-8編碼中永遠不會出現,因此他們可以用來表明UTF-16或UTF-32文本(見BOM) UTF-8 是字節順序無關的。它的字節順序在所有系統中都是一樣的,因此它實際上並不需要BOM。
缺點
你無法從UNICODE字符數判斷出UTF-8文本的字節數,因為UTF-8是一種變長編碼它需要用2個字節編碼那些用擴展ASCII字符集只需1個字節的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8編碼會被email網關過濾,因為internet信息最初設計為7位ASCII碼。因此產生了UTF-7編碼。 UTF-8 在它的表示中使用值100xxxxx的幾率超過50%, 而現存的實現如ISO 2022, 4873, 6429, 和8859系統,會把它錯認為是C1 控制碼。因此產生了UTF-7.5編碼。


