一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python解決漢字編碼問題:Unicode Decode Error

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

2020-09-18 10:41漁人 Python

最近在利用python讀取一個含有漢字的文檔時導致出現了亂碼,并報出了兩個錯誤,無奈只能上網找尋答案,后通過網友的幫助解決了這個問題,想著總結一下,下面這篇文章就主要介紹了python如何解決漢字編碼問題,有需要的朋友

前言

最近由于項目需要,需要讀取一個含有中文的txt文檔,完了還要保存文件。文檔之前是由base64編碼,導致所有漢字讀取顯示亂碼。項目組把base64廢棄之后,先后出現兩個錯誤:

?
1
2
ascii codec can't encode characters in position ordinal not in range 128
UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。

如果對于ascii、unicode和utf-8還不了解的小伙伴,可以看之前的這篇文章關于字符串和編碼

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

  1. ascii只能表示數字、英文字母和一些特殊符號,不能表示漢字
  2. unicode和utf-8都可以表示漢字,unicode是固定長度,utf-8是可變長度
  3. 內存中存儲方式一般為unicode,而磁盤文件存儲方式一般為utf-8,因為utf-8可以節約存儲空間

那么python的默認編碼是什么?

?
1
2
3
4
5
6
7
8
>>> 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的方式改變數據的編碼,比如:

?
1
2
3
4
5
6
>>> 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是什么類型?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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 in
position 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的時候都會報錯,牢記下面的規則:

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

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

?
1
2
3
import sys
reloads(sys)
sys.setdefaultencoding('utf-8')

對于第二個問題,是在文件讀取的時候出的錯。utf-8的文件有bom和無bom兩種方式,兩者的差別好像在bom文件比無bom文件多了一個頭,導致以utf-8方式讀文件時報錯,我先前曾嘗試讀文件的時候先對有無bom進行判斷,跳過bom文件的頭,后來失敗了,真尷尬~~。

還得上google求助大神,具體的操作方法就是使用codecs庫來讀文件(我猜這個庫就是對文件的頭進行檢測)。

?
1
2
import codecs
codecs.open(file_name, "r",encoding='utf-8', errors='ignore')

對于編碼問題,一定要懂得ascii、unicode和utf-8工作原理。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

原文鏈接:http://yuren.space/blog/2016/07/31/python如何解決漢字編碼問題/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 4虎影院永久地址www | a黄色 | 大陆国语自产精品视频在 | 91韩国女主播 | 精品国产综合 | 国产区久久 | 欧美国产日韩1区俺去了 | 精品精品国产自在香蕉网 | 国产免费看黄的私人影院 | 精品一区heyzo在线播放 | 亚洲精品成人在线 | 奇米影视中文字幕 | 5g影院天天5g爽天天看 | 日本在线视频播放 | 邪恶肉肉全彩色无遮盖 | 性欧美sexvideo另类 | aaaa大片 | 91免费视频国产 | 青草社区视频 | 四虎最新永久免费视频 | 2020最新版的ab片 | 男女拍拍拍免费视频网站 | 美女的隐私无遮挡的网页 | 久久青青草原精品国产软件 | 2018亚洲男人天堂 | 美女扒开胸罩露出胸大乳 | 亚洲 欧美 另类 中文 在线 | 精品一卡2卡3卡4卡5卡亚洲 | 国产精品视频在线观看 | 国产成人久久精品推最新 | 大胆私拍模特国模377 | 男人都懂www深夜免费网站 | 欧美日韩国产亚洲一区二区三区 | 32pao强力打造免费高速高 | 天堂a免费视频在线观看 | 日本中文字幕二区三区 | 亚洲成综合人影院在院播放 | 美女狂揉尿口揉到失禁 | 色婷婷在线播放 | 激情小说欧美图片 | 猫咪社区免费资源在线观看 |