如何處理中午編碼的問題python
Python的UnicodeDecodeError: 'utf8' codec can't decode byte 0xxx in positionlinux
這個錯誤是由於你代碼中的某個字符串使用了費ascii編碼的字符,也就是它表明的16進制的編碼超過127。ide
解決這個問題可使用下面的方法解決,其實就是設置默認的編碼。python 2.x的默認編碼是ascii,若是改成utf-8,就能夠了。函數
import sys reload( sys ) google
sys.setdefaultencoding('utf-8')編碼
其實從python 3.0之後默認就用utf-8,就沒有這個問題了。url
新手寫pyhton程序常常遇到編碼問題,實際上是對py的編碼不熟悉,常常範小毛病,鬱悶很久。。。spa
今天終於搞懂的py的編碼。.net
1. pyhton的全部內置庫、方法接受的是unicode編碼的字符串。code
2. str.decode 函數就是轉成unicode編碼,因此能decode的字符串傳級python的內置庫、函數都能正確運行。
3.問題在於這個decode函數解碼時到底要傳哪一個參數:utf-8,gbk,gb2312......等N種編碼。參數不當,就會拋相似異常:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
下面舉個例子:
#coding:utf-8
如何判斷字符str的編碼是什麼?
使用 chardet 能夠很方便的實現字符串/文件的編碼檢測。尤爲是中文網頁,有的頁面使用GBK/GB2312,有的使用UTF8,若是你須要去爬一些頁面,知道網頁編碼很重要的,雖然HTML頁面有charset標籤,可是有些時候是不對的。那麼chardet就能幫咱們大忙了。
>>> import urllib >>> rawdata = urllib.urlopen('http://www.google.cn/').read() >>> import chardet >>> chardet.detect(rawdata) {'confidence': 0.98999999999999999, 'encoding': 'GB2312'} >>>
chardet能夠直接用detect函數來檢測所給字符的編碼。函數返回值爲字典,有2個元數,一個是檢測的可信度,另一個就是檢測到的編碼。
下載chardet後,解壓chardet壓縮包,直接將chardet文件夾放在應用程序目錄下,就可使用import chardet開始使用chardet了。
或者使用setup.py安裝文件,將chardet拷貝到Python系統目錄下,這樣你全部的python程序只要用import chardet就能夠了。
python setup.py install
總結 :
儘可能把全部的input 都decode成unicode。即 str.decode('utf-8');
輸出時,再encode成所需的編碼格式
decode的做用是將其餘編碼的字符串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串str1轉換成unicode編碼。
encode的做用是將unicode編碼轉換成其餘編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串str2轉換成gb2312編碼。