>>a='中'>>>type(a)>>>isinstance(a,basestring)True>>>a=u'中'>>>type(a)>>>isin" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python中的編碼知識整理匯總

系統 1847 0

問題

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

            
UnicodeDecodeError: 'ascii' codec can't decode byte

          

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

基礎知識

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

            
>>> a = '中'
>>> type(a)

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

              
                
>>> 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 "
            
              ", line 1, in 
              
                
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)

            
              
>>> 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都顯示指定編碼方式。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 香蕉成人影院 | 国产天天射 | 日本a免费观看 | 91探花国产综合在线精品 | 日韩高清性爽一级毛片免费 | 日韩在线a视频免费播放 | 亚洲综合精品一区二区三区中文 | 欧美亚洲综合另类成人 | 久久天天躁狠狠躁夜夜爽 | 福利视频在线观看午夜 | www.奇米影视.com| 欧美日韩中文在线 | 中文字暮文字暮 | 日本不卡高清中文字幕免费 | 国产一区国产二区国产三区 | 久草综合视频在线 | 亚洲天堂福利视频 | 精品国产免费久久久久久婷婷 | 欧美日韩国产另类一区二区三区 | 26uuu欧美 | 狠狠综合久久久久综合 | 全高清特级毛片 | 91精品专区 | 奇米影视999 | 日韩国产精品99久久久久久 | 国产成 人 综合 亚洲网 | 国产成人丝袜网站在线看 | 国产日韩精品一区二区 | 亚洲国产精品第一区二区 | 91精品国产91久久久久久麻豆 | 成人不卡视频 | 一级片免费 | 欧美日本在线一区二区三区 | 日日操干 | 水蜜桃网站 | 久久精品中文字幕第一页 | 久久96精品国产 | 精品综合久久久久久97超人 | 中文精品久久久久国产不卡 | 欧洲一级做a爱在线观看 | 久久成人免费播放网站 |