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

首頁 > 編程 > Python > 正文

python中的編碼知識整理匯總

2019-11-25 16:57:46
字體:
來源:轉載
供稿:網友

問題

在平時工作中,遇到了這樣的錯誤:

UnicodeDecodeError: 'ascii' codec can't decode byte

想必大家也都碰到過,很常見 。于是決定對python的編碼做一個整理和學習。

基礎知識

在python2.x中,有兩種數據類型,unicode和str,這兩個都是basestring的子類

>>> a = '中'>>> type(a)<type 'str'>>>> isinstance(a,basestring)True>>> a = u'中'>>> type(a)<type 'unicode'>>>> isinstance(a,basestring)True

兩者的區別,概括來講,str是字節串,由unicode經過編碼(encode)后的字節組成的(好比與python3.x的byte);unicode是對象,才是真正意義上的字符串,由字符組成

>>> a='中文'>>> len(a)6>>> repr(a)"'//xe4//xb8//xad//xe6//x96//x87'">>> b=u'中文'>>> len(b)2>>> repr(b)"u'//u4e2d//u6587'"

控制臺和腳本

在linux下的python控制臺執行以下命令,所得的結果和執行腳本是不同的

>>> a = u'中文'>>> repr(a)"u'//xe4//xb8//xad//xe6//x96//x87'">>> b = unicode('中文','utf-8')b)>>> repr(b)"u'//u4e2d//u6587'"

可以看到,u'中文'初始化的對象a不是我們所期望的,那究竟是什么原因呢?
將python看成是一根管子,管子里頭處理的中間過程都是使用unicode的。入口處,全部轉成unicode;出口處,再轉成目標編碼(當然,有例外,處理邏輯中要用到具體編碼的情況)。
在控制臺執行命令a = u'中文',可以將解釋為命令,a = ‘中文'.decode(encode),從而到到unicode對象a。那么這里的encode是什么呢?對于控制臺來說,就是標準輸入,即sys.stdin.encoding

>>> sys.stdin.encoding'ISO-8859-1'

我的這邊控制臺默認的編碼是ISO-8859-1,故a = u'中文' <=> a = '中文'.decode('ISO-8859-1')
這里的'中文'是控制臺理解的,即使根據終端編碼方式編碼后的字節碼,對于utf-8編碼的終端,'中文'='//xe4//xb8//xad//xe6//x96//x87'

>>> a='中文'.decode('ISO-8859-1') >>> repr(a)"u'//xe4//xb8//xad//xe6//x96//x87'"

那如何修改此編碼值呢,設置為什么呢?在linux環境中設置環境變量方法如下,具體設置什么只要與終端編碼方式一直即可

export PYTHONIOENCODING=UTF-8

總結

重新回到最初的那個問題,造成問題的原因是沒有搞清楚unicode和str的區別,將兩者進行了混用。

>>> a = '中文'>>> a.encode('gbk')Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

以上的對象a其實是str,即字節碼,若終端是utf-8編碼的話,那么a就是用utf-8 encode的字節碼。a.encode('gbk') 等價于a.decode(encoding).encode('gbk'),即先將字節碼解碼為unicode字符,然后再encode為字節碼。unicode對象作為中轉站。那么這里的encoding是什么呢?

>>> import sys>>> sys.getdefaultencoding()'ascii'

默認是ascii,這正是錯誤為什么報無法用ascii解碼的原因

>>> reload(sys)<module 'sys' (built-in)>>>> sys.setdefaultencoding('utf-8')>>> a = '中文'>>> repr(a)"'//xe4//xb8//xad//xe6//x96//x87'">>> a.encode('gbk')'/xd6/xd0/xce/xc4'

將默認編碼改為utf-8,即可。不鼓勵對str使用encode方法,因為其中隱式對str進行了解碼。decode只對str,encode只對unicode,一切decode/encode都顯示指定編碼方式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南宫市| 沂南县| 兴隆县| 买车| 南岸区| 砀山县| 砚山县| 都昌县| 天等县| 无极县| 海阳市| 太谷县| 德保县| 南宫市| 调兵山市| 大宁县| 开化县| 保山市| 蓬溪县| 宜春市| 瑞丽市| 信阳市| 新巴尔虎右旗| 静海县| 金湖县| 宿松县| 吴忠市| 陇南市| 巨野县| 四川省| 阜阳市| 连平县| 台江县| 文化| 伽师县| 夹江县| 马公市| 伊通| 满城县| 林周县| 渭南市|