更新:
一個解釋更詳細和全面的博文:https://www.cnblogs.com/zhangqigao/p/6496172.html
最近開始處理中文文本,讀取文件有時候會出現亂碼。緣由:編碼和解碼方式不同。
因此,解決這個問題的方法就是正確地解碼,問題拆解爲:一、弄清楚待查看文件的編碼方式;二、解碼。
即:
一、查看文件編碼方式:
import chardet
fobj=open(fname,'r')
data=fobj.read()
print chardet.detect(data)['encoding']
二、編碼類型轉換
python默認使用unicode字符集,默認編碼方式utf-8.
str.decode('gbk') #將gbk編碼的字符串轉換成unicode編碼
str.encode('gbk') #將unicode編碼的字符串轉換成gbk編碼
附錄A:
windows文件默認編碼方式與地域有關:微軟爲了適應世界上不一樣地區用戶的文化背景和生活習慣,在Windows中設計了區域(Locale)設置的功能。每一個Locale表明了某個國家或地區的一組設定,包括字符集,數字、貨幣、時間和日期的格式等。Windows用一個4字節32位二進制值給Locale編號,記做LCID(Locale ID)。它的高16位表示字符的排序方法,通常爲0。在它的低16位中,低10位表明某種語言,高4位指定該語言適用的地區。如中文在中國大陸地區和臺灣地區有簡體和繁體的區分,它們的低10位相同而高4位不一樣。
Linux文件的默認編碼方式能夠在終端執行locale命令,查看輸出結果中 LC_CTYPE 對應的內容。
附錄B:
1981,中國國家標準總局發佈GB2312字符集(16位)。
1993 ,國際標準組織發佈
unicode 1.1字符集(unicode字符集有多個編碼方式,分別是UTF-8,UTF-16,UTF-32和UTF-7。)。
中國國家標準總局發佈GB13000.1-93字符集(16位)。擴充GB2312字符集=>
GBK(guo biao kuo)字符集(16位)。
就包含字符來講: GBK = GB2312 +繁體中文+1981年以後簡化的簡體中文
就包含的中文字符而言:GBK= Unicode 1.1 + GB13000.1-93