字符串是Python中最常用的數據類型,而且很多時候你會用到一些不屬于標準ASCII字符集的字符,這時候代碼就很可能拋出UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 10: ordinal not in range(128)異常。這種異常在Python中很容易遇到,尤其是在Python2.x中,是一個很讓初學者費解頭疼的問題。不過,如果你理解了Python的Unicode,并在編碼中遵循一定的原則,這種編碼問題還是比較容易理解和解決的。
字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。但是,Python 2.x的默認編碼格式是ASCII,就是說,在沒有指定Python源碼編碼格式的情況下,源碼中的所有字符都會被默認為ASCII碼。也因為這個根本原因,在Python 2.x中經常會遇到UnicodeDecodeError或者UnicodeEncodeError的異常。
關于Unicode
Unicode是一種字符集,它為每一種現代或古代使用的文字系統中出現的每一個字符都提供了統一的序列號,規定了符號的二進制代碼,但沒有規定這個二進制代碼應該如何存儲。也就是說:Unicode的編碼方式是固定的,但是實現方式根據不同的需要有跟多種,常見的有UTF-8、UTF-16和UTF-32等。更多的介紹大家可以參看維基百科:Unicode
為了能夠處理Unicode數據,同時兼容Python某些內部模塊,Python 2.x中提供了Unicode這種數據類型,通過decode和encode方法可以將其它編碼和Unicode編碼相互轉化,但同時也引入了UnicodeDecodeError和UnicodeEncodeError異常。。
常見的幾種編碼異常
Python中常見的幾種編碼異常有SyntaxError: Non-ASCII character、UnicodeDecodeError和UnicodeEncodeError等。下面依次舉例說明一下:
1、SyntaxError: Non-ASCII character
這種異常最不容易出現,也最容易處理,主要原因是Python源碼文件中有非ASCII字符,而且同時沒有聲明源碼編碼格式,例如:
s = '中文'print s # 拋出異常
2、UnicodeDecodeError
這個異常有時候會在調用decode方法時出現,原因是Python打算將其他編碼的字符轉化為Unicode編碼,但是字符本身的編碼格式和decode方法傳入的編碼格式不一致,例如:
#!/usr/bin/python# -*- coding: utf-8 -*-s = '中文's.decode('gb2312') # UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequenceprint s
上面這段代碼中字符串s的編碼格式是utf-8,但是在使用decode方法轉化為Unicode編碼時傳入的參數是‘gb2312',因此在轉化的時候拋出UnicodeDecodeError異常。還有一種情況是在encode的時候:
新聞熱點
疑難解答