如何處理中午編碼的問題
Python的UnicodeDecodeError: 'utf8' codec can't decode byte 0xxx in position
這個錯誤是因為你代碼中的某個字符串使用了費ascii編碼的字符,也就是它代表的16進制的編碼超過127。
解決這個問題可以使用下面的方法解決,其實就是設置默認的編碼。python 2.x的默認編碼是ascii,如果改為utf-8,就可以了。
import sys reload( sys )
sys.setdefaultencoding('utf-8')
其實從python 3.0以后默認就用utf-8,就沒有這個問題了。
新手寫pyhton程序經常遇到編碼問題,其實是對py的編碼不熟悉,經常范小毛病,郁悶好久。。。
今天終於搞懂的py的編碼。
1. pyhton的所有內置庫、方法接受的是unicode編碼的字符串。
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
- #指定本文件編碼為utf8
- import os
- # 以下為示例代碼,不一定能運行。隨意寫的,無編譯運行過。
- # 例子以XP平台為例,因為linux平台編碼(UTF-8)與window平台(GBK)不一樣。
- # 假設D盤下面有很多中文名稱文件
- filelist = os.listdir(r"d:\\") # 此處返回的list中的中文是以GBK編碼的,你可以通過查看cmd窗口屬性看到。
- for path in filelist:
- if os.path.isdir(path): continue
- fp = open(path.decode("GBK") , 'rb') # 如果此處用 path.decode("UTF-8") 就會拋異常,原因是wind的dir命令返回的是GBK編碼
- print len(fp.read())
- fp.close()
- filepath =r"d:\\中文文件.doc" # 假設此文存在,記得要帶中文
- fp = open(filepath.decode('utf-8'), "rb") #這里使用utf8參數進行解碼,原因是文件頭里有句coding: utf-8
- print len(fp.read())
- fp.close()
- path2 = u"d:\\中文文件.doc" # 假如這里有個u在前面,這個變量就是unicode編碼了,不用解碼。
- fp = open(path2, 'rb')
- print len(fp.read())
- fp.close()
如何判斷字符str的編碼是什么?
使用 chardet 可以很方便的實現字符串/文件的編碼檢測。尤其是中文網頁,有的頁面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些頁面,知道網頁編碼很重要的,雖然HTML頁面有charset標簽,但是有些時候是不對的。那么chardet就能幫我們大忙了。
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壓縮包,直接將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編碼。
