[轉(zhuǎn)]解決python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX

從網(wǎng)上抓了一些字節(jié)流,想打印出來結(jié)果發(fā)生了一下錯誤:

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 8530: illegal multibyte sequence

代碼

importurllib.request

res=urllib.request.urlopen('http://www.baidu.com')

htmlBytes=res.read()print(htmlBytes.decode('utf-8'))

錯誤信息讓人很困惑,為什么用的是'utf-8'解碼,錯誤信息卻提示'gbk'錯誤呢?

不僅如此,從百度首頁的html中發(fā)現(xiàn)以下代碼:

這說明網(wǎng)頁的確用的是utf-8,為什么會出現(xiàn)Error呢?

在python3里,有幾點關(guān)于編碼的常識

1.字符就是unicode字符,字符串就是unicode字符數(shù)組

如果用以下代碼測試,

print('a'=='\u0061')

會發(fā)現(xiàn)結(jié)果為True,足以說明兩者的等價關(guān)系。

2.str轉(zhuǎn)bytes叫encode,bytes轉(zhuǎn)str叫decode,如上面的代碼就是將抓到的字節(jié)流給decode成unicode數(shù)組

我根據(jù)上面的錯誤信息分析了字節(jié)流中出現(xiàn)\xbb的地方,發(fā)現(xiàn)有個\xc2\xbb的特殊字符?,我懷疑是它無法被解碼。

用以下代碼測試后

print(b'\xc2\xbb'.decode('utf-8'))

它果然報錯了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

上網(wǎng)找了下utf-8編碼表,發(fā)現(xiàn)的確特殊字符?的utf-8形式就是c2bb,unicode是'\u00bb',為什么無法解碼呢。。。

仔細看看錯誤信息,它提示'gbk'無法encode,但是我的代碼是utf-8無法decode,壓根牛頭不對馬嘴,終于讓我懷疑是print函數(shù)出錯了。。于是立即有了以下的測試

print('\u00bb')

結(jié)果報錯了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

原來是print()函數(shù)自身有限制,不能完全打印所有的unicode字符。

知道原因后,google了一下解決方法,其實print()函數(shù)的局限就是Python默認編碼的局限,因為系統(tǒng)是win7的,python的默認編碼不是'utf-8',改一下python的默認編碼成'utf-8'就行了

importio

importsys

importurllib.request

sys.stdout= io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#改變標(biāo)準(zhǔn)輸出的默認編碼res=urllib.request.urlopen('http://www.baidu.com')

htmlBytes=res.read()print(htmlBytes.decode('utf-8'))


運行后不報錯了,但是居然有好多亂碼(英文顯示正常,中文則顯示亂碼)??!又一陣折騰后發(fā)現(xiàn)是控制臺的問題,具體來說就是我在cmd下運行該腳本會有亂碼,而在IDLE下運行卻很正常。

由此我推測是cmd不能很好地兼容utf8,而IDLE就可以,甚至在IDLE下運行,連“改變標(biāo)準(zhǔn)輸出的默認編碼”都不用,因為它默認就是utf8。如果一定要在cmd下運行,那就改一下編碼,比如我換成“gb18030”,就能正常顯示了:

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')#改變標(biāo)準(zhǔn)輸出的默認編碼

最后,附上一些常用的和中文有關(guān)的編碼的名稱,分別賦值給encoding,就可以看到不同的效果了:

編碼名稱用途

utf8所有語言

gbk簡體中文

gb2312簡體中文

gb18030簡體中文

big5繁體中文

big5hkscs繁體中文


http://www.cnblogs.com/feng18/p/5646925.html

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

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

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