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

所以UTF-8編碼的字符串開頭處的三個bytes 0xef,0xbb,0xbf就稱爲UTF-8 BOM頭。spa

爲何excel打開沒有BOM頭的csv文件會亂碼?

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

那麼若是一個UTF-8編碼的字符串的開頭處沒有BOM頭又會發生什麼?
好比咱們用C#建立一個csv文件,裏面保存中文,日文等多國語言的字符串而後以UTF-8編碼保存(此時沒有UTF-8 BOM頭)。
記事本可以識別,可是excel卻識別出錯:code

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

好了,從新用Excel打開,已經能夠正確識別了!ip

相關文章
相關標籤/搜索