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"。windows

這樣接受者若是收到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編碼的。
微軟作這種檢測,但有些軟件不作這種檢測, 而把它看成正常字符處理。spa

 

微軟在本身的UTF-8格式的文本文件以前加上了EF BB BF三個字節, windows上面的notepad等程序就是根據這三個字節來肯定一個文本文件是ASCII的仍是UTF-8的, 然而這個只是微軟暗自做的標記, 其它平臺上並無對UTF-8文本文件作個這樣的標記。code

 

也就是說一個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會使用兩個或三個字節


utf-8

相關文章
相關標籤/搜索