本文實例講述了python實現unicode轉中文及轉換默認編碼的方法。分享給大家供大家參考,具體如下:
一、在爬蟲抓取網頁信息時常需要將類似"/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8"轉換為中文,實際上這是unicode的中文編碼。可用以下方法轉換:
1、
>>> s = u'/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8'>>> print s人生苦短,py是岸
2、
>>> s = r'/u4eba/u751f/u82e6/u77ed/uff0cpy/u662f/u5cb8'>>> s = s.decode('unicode_escape')>>> print s人生苦短,py是岸
二、另外,在python2的字符編碼問題時常會遇到“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)”的編碼錯誤。
而用以下方法通??梢越鉀Q:
import sysreload(sys)sys.setdefaultencoding('utf-8')
此方法是將Python2的默認編碼ASCII改為 utf-8。但此方法不是一勞永逸的,可能會使一些代碼的行為變得怪異。
關于sys.setdefaultencoding('utf-8')的補充:
sys.setdefaultencoding('utf-8')
會導致的兩個大問題
簡單來說這么做將會使得一些代碼行為變得怪異,而這怪異還不好修復,以一個不可見的 bug 存在著。下面我們舉兩個例子。
1. 編碼錯誤
import chardetdef print_string(string): try: print(u"%s" % string) except UnicodeError: print u"%s" % unicode(byte_string, encoding=chardet.detect(string)['encoding'])print_string(u"þ".encode("latin-1"))import sysreload(sys)sys.setdefaultencoding('utf-8')print(key_in_dict('þ'))
輸出:
$~ þ$~ þ
在上面的代碼中,默認的 ascii 編碼無法解碼,þ latin-1 編碼 hex 表示是 c3 be ,顯然是超出了只有128個字符的 ascii 碼集的,引發 UnicodeError 異常,進入異常處理。異常處理則會根據編碼探測,用最可能的編碼來解碼,會比較靠譜地輸出 þ 。
而一旦我們將 defaultencoding 設置為 utf-8,因為 utf-8 的字符范圍是完全覆蓋 latin-1,因此,會直接使用 utf-8 進行解碼。c3 be 在 utf-8 中,是 þ。于是我們打印出了完全不同的字符。
可能你們會說我們不會寫這樣的代碼。如果我們寫了也會做修正。但如果是第三方庫這么寫了呢?項目依賴的第三方庫就這么 bug 了。如果你不依賴第三方庫,那么下面這個 bug,還是逃不過。
2. dictionray 行為異常
假設我們要從一個 dictionary 里查找一個 key 是否存在,通常來說,有兩種可行方法。
#-*- coding: utf-8 -*-d = {1:2, '1':'2', '你好': 'hello'}def key_in_dict(key) if key in d: return True return Falsedef key_found_in_dict(key): for _key in d: if _key == key: return True return False
新聞熱點
疑難解答