本文介紹如何解決生成內容是中文的csv file後,用excel開啟會有亂碼的問題。
了解編碼
-
UTF-8
以字節為編碼單元,在UTF-8中,字節順序在所有系統中都是一樣的。 -
UTF-8-sig
sig的意思是signature,即為帶有簽名的UTF-8,又稱UTF-8 with BOM(Byte Order Mark)。 -
BOM (Byte Order Mark)
字面上意思為"字節順序標記",出現在文件的頭部(header),在Unicode編碼標準中用於標示文件是採用何種格式的編碼。
那麼為什麼寫入CSV要用UTF-8-sig呢?
- Excel在讀取csv時是透過文件header上的BOM來識別編碼,所以若header無帶BOM資訊,那麼會依照預設的Unicode編碼讀取。
- 當我們使用UTF-8生成csv時,並未在header生成BOM訊息,所以Excel會依照Unicode編碼讀取,就會有亂碼產生。
實作
下面是簡單的生成csv的python程式:
1 2 3 4 5 6 7 8 9 |
import os import csv CSV_HEAD = ["COL01","COL02"] mydata = ["123","456"] with open("mydata.csv", 'w', newline='', encoding='utf-8-sig') as csvfile: writer = csv.writer(csvfile) writer.writerow(CSV_HEAD) writer.writerow(mydata) |
只要加上encoding=’utf-8-sig’,這樣產生的檔案用excel開啟就不會有亂碼了。
留言