utf-8編碼的csv文件 Excel 打開亂碼 輸出前加 0xEF,0xBB,0xBF 三個char


是由於輸出的CSV文件中沒有BOM.

BOM是Byte Order Mark(定義字節順序),因為在網絡傳輸中分兩種順序:大頭和小頭。

其實是UTF-8文件的Unicode簽名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來標記文本文件的編碼方式的。

 

在UTF-16里本來是FF FE,變成UTF-8就成了EF BB BF。
這個標記是可選的,因為UTF8字節沒有順序,所以它可以被用來檢測一個字節流是否是UTF-8編碼的。
微軟做這種檢測,但有些軟件不做這種檢測, 而把它當作正常字符處理。

 

微軟在自己的UTF-8格式的文本文件之前加上了EF BB BF三個字節, windows上面的notepad等程序就是根據這三個字節來確定一個文本文件是ASCII的還是UTF-8的, 然而這個只是微軟暗自作的標記, 其它平台上並沒有對UTF-8文本文件做個這樣的標記。

 

也就是說一個UTF-8文件可能有BOM,也可能沒有BOM,那么怎么區分呢?
三種方法:
1,用UltraEdit-32打開文件,切換到十六進制編輯模 式,察看文件頭部是否有EF BB BF。
2,用Dreamweaver打開,察看頁面屬性,看“包括Unicode簽名BOM”前面是否有個勾。
3,用Windows的記事本打開,選擇 “另存為”,看文件的默認編碼是UTF-8還是ANSI,如果是ANSI則不帶BOM。

另 外還有一些編碼的小知識:
所謂的unicode保存的文件實際上是utf-16,只不過恰好跟unicode的碼相同而已,但在概念上unicode與 utf是兩回事,unicode是內存編碼表示方案,而utf是如何保存和傳輸unicode的方案。
utf-16還分高位在前 (LE)和高位在后(BE)兩種。官方的utf編碼還有utf-32,也分LE和BE。
非unicode官方的utf編碼還有utf-7,主要用於郵件傳 輸。
utf-8的單字節部分是和iso-8859-1兼容的,這主要是一些舊的系統和庫函數不能正確處理utf-16而被迫出來的,而且對英語字符來說, 也節省保存的文件空間(以非英語字符浪費空間為代價)。
在iso-8859-1的時候,utf8和iso-8859-1都是用一個字節表示的,當表示其它 字符的時候,utf-8會使用兩個或三個字節



免責聲明!

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



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