国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python解決漢字編碼問題:Unicode Decode Error

2020-02-23 04:17:20
字體:
來源:轉載
供稿:網友

前言

最近由于項目需要,需要讀取一個含有中文的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還不了解的小伙伴,可以看之前的這篇文章關于字符串和編碼

那么必須對下面這三個概念有所了解:

    ascii只能表示數字、英文字母和一些特殊符號,不能表示漢字 unicode和utf-8都可以表示漢字,unicode是固定長度,utf-8是可變長度 內存中存儲方式一般為unicode,而磁盤文件存儲方式一般為utf-8,因為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'))babad7d6

binascii是將數據的二進制轉換成ascii,上面的解釋是:‘漢字'的類型是str,二進制是babad7d6,u‘漢字'是無法轉換成ascii,這樣就報出了開頭的第一個錯誤。解決辦法就是把它.encode(‘utf-8')成str類型。因為我命令行是windows默認的GBK編碼,所有u'漢字'.encode(‘gbk')的時候,輸出結果和‘漢字'結果一樣。

總結一下,python的str實際上是unicode的一種,python的默認編碼是ascii,對于非ascii轉成ascii的時候都會報錯,牢記下面的規則:

    unicode => encode(‘合適的編碼') => str str => decode(‘合適的編碼') => unicode

還有一種簡單的方式,就是在文件頭設置編碼,可以省去很多麻煩:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 关岭| 丹阳市| 维西| 敖汉旗| 新安县| 宣城市| 古交市| 淳化县| 玛纳斯县| 塔城市| 万载县| 高阳县| 达日县| 宜都市| 岱山县| 文登市| 封丘县| 鄯善县| 太湖县| 洪雅县| 乌兰浩特市| 滁州市| 墨脱县| 奉贤区| 泰来县| 横山县| 宁陕县| 多伦县| 方山县| 武宁县| 巨野县| 巴彦县| 卓尼县| 三门峡市| 吉林省| 伊吾县| 苏尼特右旗| 勐海县| 大足县| 上饶县| 贞丰县|