前言
最近由于項目需要,需要讀取一個含有中文的txt文檔,完了還要保存文件。文檔之前是由base64編碼,導致所有漢字讀取顯示亂碼。項目組把base64廢棄之后,先后出現兩個錯誤:
ascii codec can't encode characters in position ordinal not in range 128UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。
如果對于ascii、unicode和utf-8還不了解的小伙伴,可以看之前的這篇文章關于字符串和編碼
那么必須對下面這三個概念有所了解:
那么python的默認編碼是什么?
>>> import sys>>> sys.getdefaultencoding()'ascii'>>> reload(sys)<module 'sys' (built-in)>>>> sys.setdefaultencoding('utf-8')>>> sys.getdefaultencoding()'utf-8'python的默認編碼是ascii,可以通過sys.setdefaultencoding('utf-8')函數設置python的默認編碼。
python中可以通過encode和decode的方式改變數據的編碼,比如:
>>> u'漢字'u'/u6c49/u5b57'>>> u'漢字'.encode('utf-8')'/xe6/xb1/x89/xe5/xad/x97'>>> u'漢字'.encode('utf-8').decode('utf-8')u'/u6c49/u5b57'我們可以通過這兩個函數設置編碼。
那么,python中的str是什么類型?
>>> import binascii>>> '漢字''/xba/xba/xd7/xd6'>>> type('漢字')<type 'str'>>>> print binascii.b2a_hex('漢字')babad7d6>>> print binascii.b2a_hex(u'漢字')Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeEncodeError: 'ascii' codec can't encode characters inposition 0-1: ordinal not in range(128)>>> print binascii.b2a_hex(u'漢字'.encode('utf-8'))e6b189e5ad97>>> print binascii.b2a_hex(u'漢字'.encode('gbk'))babad7d6binascii是將數據的二進制轉換成ascii,上面的解釋是:‘漢字'的類型是str,二進制是babad7d6,u‘漢字'是無法轉換成ascii,這樣就報出了開頭的第一個錯誤。解決辦法就是把它.encode(‘utf-8')成str類型。因為我命令行是windows默認的GBK編碼,所有u'漢字'.encode(‘gbk')的時候,輸出結果和‘漢字'結果一樣。
總結一下,python的str實際上是unicode的一種,python的默認編碼是ascii,對于非ascii轉成ascii的時候都會報錯,牢記下面的規則:
還有一種簡單的方式,就是在文件頭設置編碼,可以省去很多麻煩:
新聞熱點
疑難解答