python字符編碼問題的總結

概述:

以前剛學python時候遇到了一些關於字符編碼的奇怪問題,沒有仔細研究,而且爲了避免這個問題就全用英文了,但是今天開始寫的程序需要抓取網頁上的中文,解析下來後字符編碼的問題又回來了,而且比以前來的更猛烈,程序崩潰的嘩啦呼啦的。所以抽出了很長時間,仔細的研究了一下,希望看到文章的同學也能不再爲字符編碼的問題困擾。充斥在網絡上的信息無數,但他們都逃不出要被編碼的命運,在國內的網絡環境下,我們可能接觸到的編碼格式有,ascii,unicode,utf-8,gb2312,gbk等。正是這幾種編碼的混合出現才造成了我們遇到的字符編碼的問題,如果只有一種就不會有這個難纏的問題了。關於字符編碼的詳細介紹可以看這位博主的文章傳送門

環境:python 2.7.11


問題引出:

def foo(user,action=u'逛街'):
    print type(action)
    print '%sis%s' %(user,action)

if __name__ == '__main__':
    foo('小李')

這段程序拋出瞭如下的異常

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
一開始以爲在開頭忘記聲明瞭#coding:utf-8(#_*_ coding:utf-8 _*_與前面的不同只是這個比較好看一點),但是明明聲明瞭,這就很奇怪了,修改程序。

def foo(user,action=u'逛街'):
    print type(action)
    print '%s' %(user)

if __name__ == '__main__':
    foo('小李')
這樣就沒問題了,也就是說只有兩個一起出現的時候纔有問題?仔細觀察程序發現是action=u'逛街'的問題,既然開頭聲明瞭是utf-8,這裏又使用unicode,那當然是有問題的了,utf-8對中文是三個字節表示,而uniocde是兩個,這兩種放在一起print函數取解碼的時候當然會混淆了。把action=‘逛街’就可以了。兩種編碼統一了,就不會出問題了。但是追究根源爲什麼會寫成action=u'逛街',原來是在命令行下測試腳本的一個小習慣。

python終端下的字符編碼問題:


直接在終端下將一箇中文串賦值給變量他的編碼如上所示爲'\xd6\xd0',在練習廖雪峯python3教程的時候有關於,encode和decode的部分,當時沒有在意,使用當前的這個2.7版本練習的,總是在text.encode('utf-8')的時候卻出現了問題。


原來python2的編碼只有ascii和unicode兩種,所有其他編碼都要先轉換成unicode碼才能進行其他轉換也就是說上面的'\xd6\d0'看起來是ascii其實是一種其他的編碼,需要使用decode方法後,在進行編碼。但是當前text的編碼是什麼難住我了。


求助type發現系統的內建函數沒辦法幫助我了,仔細思考後發現我在終端下輸入的中文,肯定和終端有關係,我看了下終端的編碼。


看到終端的編碼是GBK我恍然大悟,原來這個中文是GBK編碼,我按照GBK對他進行解碼,也就是由GBK變成了unicode。


爲了證明一下他確實是GBK,我又看了一下'中'的GBK編碼是什麼


沒錯了,就是GBK,現在就理解直接輸入‘中’出現的編碼是什麼了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章