encode()和decode()都是字符串的函數,分別指編碼和解碼,在python中,Unicode類型是做爲編碼的基礎類型,以下:python
decode encode str ---------> str(Unicode) ---------> str
即:
str.decode()是指其餘編碼方式解碼爲unicode碼,
str.encode(‘qita’)unicode碼編爲qita格式的函數
#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文字符' # 這裏的 str 是 str 類型的,而不是 unicode print s.encode('gb2312')
這個代碼會報錯:ui
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
這句代碼直接將s 從新編碼爲 gb2312 的格式,即進行 unicode -> str 的轉換。由於 s 自己就是 str 類型的,所以
Python 會自動的先將 s 解碼爲 unicode ,而後再編碼成 gb2312。編碼
由於解碼是python自動進行的,咱們沒有指明解碼方式,python 就會使用 sys.defaultencoding指明的方式來解碼。不少狀況下 sys.defaultencoding爲ANSCII,若是 s 不是這個類型就會出錯。.net
因此要設置缺省解碼方式code
解決方法:blog
#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文字符' # 這裏的 str 是 str 類型的,而不是 unicode print s.decode('utf-8').encode('gb2312')
開頭添加以下代碼:內存
import sys reload(sys) sys.setdefaultencoding('utf-8')
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys reload(sys) # Python2.5 初始化後刪除了 sys.setdefaultencoding 方法,咱們須要從新載入 sys.setdefaultencoding('utf-8') str = '中文字符' print str.encode('gb2312')
linkutf-8
因此用utf-8基本就夠了ci