我們在用python處理中文的時候,或多或少會遇到這樣一些錯誤
常見錯誤1:
SyntaxError: Non-ASCII character '\xe4' in file C
常見錯誤2:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
毫無疑問,我們在用python2.7.x的時候都會遇到這種問題,我們常規的解法又是怎么樣的呢
# coding:utf-8 import requests def print_text(): url = 'http://www.cnblogs.com/' print requests.get(url).text.encode('utf-8') print_text()
首先在文件py文件的頭部加上標識coding:utf-8 ,然后使用encode('utf-8'),一般這樣處理,文字都可以正常顯示到我們的控制台了。那有沒有想過我們為什么要這樣做?如果你不僅是對寫code感興趣,更想了解其中的原因的話,那我們接着往下看
說起字符的編碼與解碼,那就不得不提字符集了

如圖所示,我們所知的英文編碼都是采用ansi編碼,隨着中國的崛起,國家也開始信息化,但是計算機不認識中國漢字,怎么辦呢,我們制定自己統一的字符集,這就是GB2312,
后來更新的字符集,GBK,GB18030,BIG5 ,都是在原來的基礎之上增加一些新的元素的識別,比如一些生僻字,繁體字認識。
這樣一來不是中文一套,英文一套,那后來的一些其它的國家文字不就都不能互相通用了,那干脆一鍋端,將這些英文,中文,各國的語言文字大一統,Unicode就出現了,不僅兼容了這些文字,與方便了各國的信息交流.

在Unicode編碼方式下,又存在 utf-8,utf-16,utf-32的編碼方式
通過上面的一些例子,我們可以大致對於編碼和解碼有一個大概的印象,那接下來我們看看python2.7.x對於編碼是怎么處理的,還是先上一個圖

basestring下面有兩個對象,unicode,str 那這兩者的關系是怎么樣的?
unicode ==encode==> str
str ==decode==> unicode
我們先看python的輸出
# coding:utf-8 s = '中文' print type(s)
輸出:
<type 'str'>
在看看decode之后的處理方式
# coding:utf-8 s = '中文'.decode('utf-8') print type(s)
輸出:
<type 'unicode'>
這樣實驗我們可以很直觀的感受到,當我們要輸出一個中文的時候:我們輸出的是一個經過unicode原始對象encode后的str,那當我們拿到一個返回對象,最常見的在爬蟲里面得到返回字符串的時候我們怎么處理呢?
首先我們要在py文件頭部聲明處理編碼,因為我們的py文件默認采用的是ascii編碼,當返回的字符串寫回到文檔時就與文檔編碼相沖突,這里就會報銷:
#coding:utf-8
一般我們加上coding:utf-8就夠了,或者coding:gbk也可以
然后對於返回對象我們可以查看一下類型type(response.text)
如果是unicode ,那這response.text.encode('utf-8')就可以得到我們要的str對象,如果是str,我們可以直接print出來,或者先解碼,在按你需要的方式編碼.
參考文章:
