python讀取csv編碼問題
主要參考https://www.cnblogs.com/shengulong/p/7097869.html
https://www.cnblogs.com/buptldf/p/4805879.html
首先對相關編碼進行簡單的介紹:
ASCII碼
由於計算機只能處理數字,當處理文本時,需要將文本轉換為數字。
最早計算機設計采用8比特作為一個字節,所以一個字節所表示最大的整數為255。0-255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼。比如大寫的英文字母A編碼為65,小寫的英文字母z編碼為122。
由於ASCII碼只對英文字母、數字和一些符號進行編碼,只用了0-127個數字(前7位bit)。擴展ASCII碼允許將每個字符的第8 位用於確定附加的128 個特殊符號字符、外來語字母和圖形符號。后128個稱為擴展ASCII碼。
GB2312
如果要表示中文,顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。
GB 2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。
GBK字庫
GBK 向下與 GB 2312 編碼兼容, GBK是采用單雙字節變長編碼,英文使用單字節編碼,完全兼容ASCII字符編碼,中文部分采用雙字節編碼。
Unicode編碼
Unicode當然是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣。
UTF-8
為了提高Unicode的編碼效率,於是就出現了UTF-8編碼。UTF-8可以根據不同的符號自動選擇編碼的長短。
由於字符編碼種類非常多,因此Excel有選擇性的支持了ANSI(微軟自已的)和UNICODE(大而全),不支持UTF-8很正常。記事本支持UTF-8編碼。
excel打開csv文件,可以識別編碼"GB2312",但是不能識別"utf-8",數據庫里的字符串編碼是utf-8.因此:
當從csv讀取數據(data)到數據庫的時候,需要先把GB2312轉換為unicode編碼,然后再把unicode編碼轉換為utf-8編碼:data.decode('GB2312').encode('utf-8')
注:
用gb2312編碼的csv文件,再notepad++打開如果為亂碼的話,需要將Notepad++中的字符編碼修改為中文;
如果在csv中,采用的是unicode編碼,則打開Notepad++無任何問題