Python中遇到"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence"之類的編碼或解碼的錯誤時如何處理

【背景】http://www.tuicool.com/articles/nEjiEv

問題參見:

python2.7 urllib2 抓取新浪亂碼

中的:

報錯的異常是

UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

此問題氯葬,還是很具有代表性的鱼辙,此處,專門整理如下:

【Python中如何處理UnicodeDecodeError和UnicodeEncodeError】

簡答:

1.仔細(xì)分析錯誤的類型

2.搞清自己處理的字符串是什么類型的

3.然后換用這種的字符編碼去編碼或解碼

詳解:

以上面的錯誤:

UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

為例烧颖,去解釋闷盔,如何處理這類問題:

1.仔細(xì)分析錯誤的類型

(1)錯誤是Unicode的編碼還是解碼

對于此處与柑,錯誤是:

UnicodeDecodeError

的類型的庇谆。

此英文忌锯,對應(yīng)的中文的含義幔翰,其實已經(jīng)很清楚了:

Unicode的解碼(Decode)出現(xiàn)錯誤(Error)了

而對于上面這句漩氨,我們可以推斷出:

你當(dāng)前正在處理某種編碼類型的字符串

此處你要處理字符串西壮,是想要將該字符串去解碼decode,變成Unicode

但是將該字符串解碼變成Unicode期間叫惊,卻出錯了

(2)所用的是何種編碼

好的款青,接著看上面的錯誤:

‘gbk’ codec can’t decode

使得錯誤信息更加明顯了:

你此處,要將字符串解碼為Unicode霍狰,是以gbk編碼的方式去解碼(該字符串變成Unicode)的

但是此處通過gbk的方式抡草,卻無法解碼(can’t decode )

注:此處的codec,意思是:編解碼(器)蔗坯,是Python內(nèi)部的模塊康震,用來編碼或解碼(字符串)的

(3)錯誤位置

bytes in position 2-3

此處的信息,后續(xù)一般也很少用到步悠。

有時候會用于定位具體錯誤的位置签杈。

此處暫且忽略。

(4)錯誤的細(xì)節(jié)錯誤類型

illegal multibyte sequence

翻譯為中文為:

非法的鼎兽,多字節(jié)答姥,序列

簡單說就是:

沒法(解碼)了。

【原因及解決辦法】

好了谚咬,針對于上面所分析出來的信息:

將一個字符串鹦付,通過gbk的方式,去解碼择卦,想要獲得Unicode字符串敲长,結(jié)果出錯了

我們來說說原因和解決辦法:

此種錯誤,有幾種可能:

(1)要處理的字符串本身不是gbk編碼秉继,但是你卻以gbk編碼去解碼

比如祈噪,字符串本身是utf-8的,但是你卻用gbk去解碼utf-8的字符串尚辑,所以結(jié)果不用說辑鲤,則必然出錯

則必然會出現(xiàn)這類的錯誤,說是杠茬,用gbk的方式去解碼字符串月褥,想要獲得Unicode字符串,但是結(jié)果卻解碼出錯了

解決辦法:

如果你確定當(dāng)前字符串瓢喉,比如抓取網(wǎng)頁通過charset=utf-8宁赤,已經(jīng)確定html的字符串是utf-8的,

則可以直接去通過utf-8去解碼栓票。

相關(guān)參考內(nèi)容:

詳解抓取網(wǎng)站决左,模擬登陸,抓取動態(tài)網(wǎng)頁的原理和實現(xiàn)(Python,C#等)

中的:

【整理】關(guān)于HTML網(wǎng)頁源碼的字符編碼(charset)格式(GB2312哆窿,GBK链烈,UTF-8,ISO8859-1等)的解釋

而如果本身對于所處理的字符串挚躯,不太清楚是什么編碼類型的强衡,可以嘗試去通過chardet等模塊,去檢測看看:

【教程】如何用Python中的chardet去檢測字符編碼類型

然后搞清楚了码荔,確定了漩勤,字符串是什么類型,然后再去解碼缩搅。

提示:

關(guān)于字符串編碼的類型越败,作為背景學(xué)習(xí)知識,也應(yīng)該去了解一下硼瓣。

這樣對于以后處理字符串方面究飞,會更有幫助。

(2)你沒有主動的去將字符串編碼為對應(yīng)的Unicode堂鲤,但是結(jié)果也報上面的UnicodeDecodeError的錯誤

這個情況亿傅,最常見的,就是我之前在:

【總結(jié)】Python 2.x中常見字符編碼和解碼方面的錯誤及其解決辦法

所整理過的:

“Python中瘟栖,打印字符串時葵擎,字符串本身的編碼,與輸出終端中所用編碼不匹配”

此處不再贅述半哟,只簡要再說一下:

如果你本身拿到的是utf-8等酬滤,非gbk編碼的字符串,然后用print去打印出來

在windows系統(tǒng)就是輸出到cmd中

而cmd中寓涨,(對于多數(shù)中國人所用的是中文的系統(tǒng))默認(rèn)字符編碼是gbk

從而導(dǎo)致此種現(xiàn)象:

python要將utf-8編碼的字符串盯串,在gbk的cmd的中打印出來

所以先要去嘗試,用gbk的編碼戒良,解碼為Unicode然后再打印出來

結(jié)果就出現(xiàn)此處的錯誤了嘴脾。

詳細(xì)解釋,還是參見上面的教程蔬墩。

其中還有示例代碼的。

(3)處理的字符的確是gbk的耗拓,但是其中夾雜的部分特殊字符拇颅,是gbk編碼中所沒有的

如果有些特殊字符是GB18030中有的,但是是gbk中沒有的乔询。

則用gbk去解碼樟插,去所不支持的字符,也比如會出錯。

所以黄锤,此種情況搪缨,可以嘗試用和當(dāng)前編碼(gbk)所兼容的但所包含字符更多的編碼(gb18030)去解碼,或許就可以了鸵熟。

提示:

如果對于GBK副编,GB18030,以及GB2312不了解流强,則可參考:

字符編碼簡明教程

另外:

如果遇到其他的痹届,類似此中錯誤的,比如:

UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence

等類型的錯誤打月,你就可以按照上述的思路队腐,去分析,錯誤的現(xiàn)象奏篙,原因柴淘,然后通過自己,就可以找到解決辦法了秘通。

注:

其他和這類錯誤相關(guān)的为严,也還有一些可以參考的:

【總結(jié)】靜態(tài)網(wǎng)頁抓取,動態(tài)網(wǎng)頁抓取充易,模擬登陸的注意事項和心得

中的:“返回的html內(nèi)容是亂碼”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗脾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盹靴,更是在濱河造成了極大的恐慌炸茧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稿静,死亡現(xiàn)場離奇詭異梭冠,居然都是意外死亡,警方通過查閱死者的電腦和手機改备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門控漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬钳,你說我怎么就攤上這事盐捷。” “怎么了默勾?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵碉渡,是天一觀的道長。 經(jīng)常有香客問我母剥,道長滞诺,這世上最難降的妖魔是什么形导? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮习霹,結(jié)果婚禮上朵耕,老公的妹妹穿的比我還像新娘。我一直安慰自己淋叶,他們只是感情好阎曹,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著爸吮,像睡著了一般芬膝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上形娇,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天锰霜,我揣著相機與錄音,去河邊找鬼桐早。 笑死癣缅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哄酝。 我是一名探鬼主播友存,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陶衅!你這毒婦竟也來了屡立?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搀军,失蹤者是張志新(化名)和其女友劉穎膨俐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罩句,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡焚刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了门烂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乳愉。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屯远,靈堂內(nèi)的尸體忽然破棺而出蔓姚,到底是詐尸還是另有隱情,我是刑警寧澤慨丐,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布赂乐,位于F島的核電站,受9級特大地震影響咖气,放射性物質(zhì)發(fā)生泄漏挨措。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一崩溪、第九天 我趴在偏房一處隱蔽的房頂上張望浅役。 院中可真熱鬧,春花似錦伶唯、人聲如沸觉既。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞪讼。三九已至,卻和暖如春粹断,著一層夾襖步出監(jiān)牢的瞬間符欠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工瓶埋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留希柿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓养筒,卻偏偏與公主長得像曾撤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晕粪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容