請說人話-試論P(yáng)ython3中的編碼問題

最近在玩Python3做模擬http協(xié)議的請求的時(shí)候發(fā)現(xiàn)一個(gè)問題。。。。
在對html response的decode時(shí)拋出,代碼原樣為:

response = urllib.urlopen(dsturl)
    content = response.read().decode('utf-8')

拋出錯誤為

File "./oatest_p3.py", line 20, in getAddEvent
  content = response.read().decode()
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb2 in position 19107: invalid start byte

想了半天也不明白的是在它聲明為utf-8編碼的網(wǎng)頁中為什么會出現(xiàn)utf-8無法解析的字符?
通過萬能的度娘,發(fā)現(xiàn)解決方式如下:
可以使用decode('utf-8', 'ignore')

知識點(diǎn)為:

decode是把一個(gè)無編碼的str,依照給入的參數(shù)為解碼系統(tǒng),解碼后映射到unicode字符集,返回為unicode對象,如果不是關(guān)鍵內(nèi)容,解不出來就ignore也是可以的。瀏覽器的解碼部分通常有個(gè)fallback,對utf8解不出來的字符可以嘗試使用本地local

為了以后用python3更省心一些,索性把相關(guān)的編碼知識看了一下,做一個(gè)小結(jié),希望對同掉入坑的朋友有些幫助。


編碼的黑歷史

首先我們來理一下編碼的發(fā)展歷史:

最開始出現(xiàn)計(jì)算機(jī)的時(shí)候,人類試圖用一個(gè)叫ASCIIde東西來完成和機(jī)器之前的所有對話。

但很快發(fā)現(xiàn),這樣是完全不夠用的,各個(gè)國家有各個(gè)國家的語言,比如中國,對于老外來說如同天書的中文,對于機(jī)器來說同樣無法解讀,此時(shí)聰明的人類就發(fā)明了GB2312的編碼來表示中文,很快發(fā)現(xiàn)一些特殊的字無法辨識,就又開發(fā)了GBK可以表示更多的字,后來發(fā)現(xiàn),少數(shù)民族的字連GBK都搞不定,就又多了一個(gè)GB18030,從中國的編碼發(fā)展史就可以看出每個(gè)國家都有自己的編碼格式。

照這樣發(fā)展下去,人類很快就遇到和造巴比倫塔一樣的問題。所以Unicode橫空出世,解決了所有的問題,但就有一個(gè)小缺點(diǎn),特別占存儲空間,是ASCII的兩倍,在硬件性能還是瓶頸的時(shí)候,那個(gè)酸爽,你懂的。于是呢,聰明的人類發(fā)明了遇長則長,遇短則短的Utf-8,這樣就可以更加靈活的使用存儲空間了。

看完上面長長的發(fā)展歷史,碼農(nóng)們的內(nèi)心都是崩潰的,你說沒事兒整那么多的編碼格式干嘛!@——@ 干嘛!
不過,這個(gè)已經(jīng)是既定事實(shí),我們也只好接受。


Python3中默認(rèn)是UTF-8的編碼格式,可以通過以下代碼來查看:

import sys
 
sys.getdefaultencoding()

那么問題就來了,如果我的編碼文件和需要解釋它的工程,控制臺都不是一個(gè)編碼格式,那怎么辦呢?

這時(shí),就需要祭出Python3中的針對編碼問題特別能打的兩個(gè)SSRencode和decode 函數(shù),特別是在做爬蟲項(xiàng)目的時(shí)候這兩個(gè)函數(shù)用的熟練非常有好處(不要問我是怎么知道的。。。)。

encode的作用,使我們看到的直觀的字符轉(zhuǎn)換成計(jì)算機(jī)內(nèi)的字節(jié)形式。decode剛好相反,把字節(jié)形式的字符轉(zhuǎn)換成‘人話’。

1.png

\x表示后面是十六進(jìn)制, 在Python3中,以字節(jié)形式表示的字符串則必須加上前綴b,也就是寫成上圖的b'xxxx'形式。

2.png

如果是中文字符,在用‘GBK’來encode了以后使用Python3中默認(rèn)的decode來解碼的時(shí)候就會出現(xiàn)報(bào)錯的情況,如上圖所示。所以,可以ignore了。否則就需要使用對應(yīng)的編碼格式進(jìn)行解碼,中文網(wǎng)站最常出現(xiàn)的就是GBK或者GB2312.
嗯,就這醬紫,先分析到這里。有新的發(fā)現(xiàn)再來補(bǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容