UTF-8 BOM頭

分類:IT技術 時間:2016-10-11

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編碼了。

因此UTF-8編碼的字符串開頭處的三個bytes 0xef,0xbb,0xbf就稱為UTF-8 BOM頭。

為什麽Excel打開沒有BOM頭的csv文件會亂碼?

類似Windows自帶的記事本等軟件,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入UTF-8 BOM頭。記事本等編輯器通過它來識別這個文件是否以UTF-8編碼(當然即便沒有UTF-8 BOM頭記事本也能通過其它方式正確識別UTF-8編碼)。

那麽如果一個UTF-8編碼的字符串的開頭處沒有BOM頭又會發生什麽?
比如我們用C#創建一個csv文件,裏面保存中文,日文等多國語言的字符串然後以UTF-8編碼保存(此時沒有UTF-8 BOM頭)。
記事本能夠識別,但是excel卻識別出錯:

這是一個已知的問題,Excel打開沒有BOM頭的csv文件時就是會這樣!
解決的辦法也很簡單,在生成字符串時手動把UTF-8 BOM頭添加在字符串的開頭處,下面是C#代碼:
sb.Append('\uFEFF');

好了,重新用Excel打開,已經可以正確識別了!

 


Tags: 記事本 excel 編輯器 字符串 中文

文章來源:


ads
ads

相關文章
ads

相關文章

ad