解決PHP導出CSV文件中文亂碼問題

轉載:https://www.pythontab.com/html/2019/php_0315/1403.html

什麼是CSV文件?

英文名:Comma Separator Value(逗號分隔值),常用來數據轉換的中間文件存在,比如:從Mysql中導出數據到CSV中。在web系統中經常遇到要導出報表數據,也會用到csv格式,使用utf-8編碼導出CSV文件,打開后里邊的中文成了亂碼 (Windows下CSV文件默認與Microsoft Excel關聯),用文本編輯器打開正常,不過排版很亂。原因:缺少BOM,又是微軟畫蛇添足。

什麼是BOM?

Byte Order Mark(比特序標記),微軟定義的一種頭部結構。

爲了識別 Unicode 文件,Microsoft 建議所有的 Unicode 文件應該以 ZERO WIDTH NOBREAK SPACE字符開頭。這作爲一個”特徵符”或”字節順序標記(byte-order mark,BOM)”來識別文件中使用的編碼和字節順序(big-endianlittle-endian),具體的對應關係見下表。

1

2

3

4

5

6

Bytes Encoding      Form

00 00 FE FF         UTF-32, big-endian

FF FE 00 00         UTF-32, little-endian

FE FF               UTF-16, big-endian

FF FE               UTF-16, little-endian

EF BB BF            UTF-8

類Unix系統中並沒有使用 BOM,因爲它會破壞現有的 ASCII 文件的語法約定。

我們在使用PHP導出csv文件時, 如果只使用file_put_contents 或者 fwrite 寫入了表格數據, 而我們生成csv的平臺不一定遵循微軟的bom協議,導致如果輸出非unicode編碼的csv文件(例如utf-8),並且沒有生成bom信息的話,Excel自動按照unicode編碼讀取,就會出現亂碼問題了。而沒有寫入BOM頭信息,就會出現打開中文亂碼的情況。

PHP中文亂碼解決

Excel在讀取csv的時候是通過讀取文件頭上的bom來識別編碼的,如果文件頭無bom信息,則默認按照unicode編碼讀取。

如果想使用utf-8格式,確保php源碼是utf-8,我們可以在第一行寫入utf-8對應的BOM信息

代碼如下:

1

2

3

$bom = pack('CCC', 0xef, 0xbb, 0xbf); // 和上面的對應

file_put_contents('pythontab.csv',$bom, FILE_APPEND);

file_put_contents('pythontab.csv',$someData, FILE_APPEND); //寫入你想要寫入表格的數據

前後都省略了部分代碼, 只寫了最關鍵的部分, 其它部分大家自行補充即可。

這樣生成的csv就不會出現中文亂碼問題啦。

注意:寫入的BOM頭信息要和文件的編碼對應。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章