[python基礎]關于中文編碼和解碼那點事兒
我們在用Python處理中文的時候,或多或少會遇到這樣一些錯誤
常見錯誤1:
SyntaxError: Non-ASCII character '\xe4' in file C
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)
1
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()
1
2
3
4
5
6
7
8
9
10
# 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)
1
2
3
# coding:utf-8
s = '中文'
print type(s)
輸出:
'str'>
1
'str'>
在看看decode之后的處理方式
# coding:utf-8 s = '中文'.decode('utf-8') print type(s)
1
2
3
# coding:utf-8
s = '中文'.decode('utf-8')
print type(s)
輸出:
'unicode'>
1
'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出來,或者先解碼,在按你需要的方式編碼.
參考文章:
中文編碼雜談
python進階-編碼處理小結
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。