基本概念
- str和unicode都是basestring的子類
- 關係:
str -> decode('the_coding_of_str') -> unicode
unicode -> encode('the_coding_you_want') -> str - 區別:
>>> a='我' # str
>>> b=u'我' # unicode
>>> a
'\xce\xd2'
>>> b
u'\u6211'
- str是字節串,由unicode經過編碼(encode)後的字節組成的
unicode纔是真正意義上的字符串,由字符組成
- 思路:搞明白要處理的是str還是unicode, 使用對的處理方法(str.decode//or//unicode.encode)
- 簡單原則:不要對str使用encode,不要對unicode使用decode (事實上可以對str進行encode的,具體見最後,爲了保證簡單,不建議)
簡記
- encode是編碼,decode是解碼
- 編碼:採用一定的編碼格式將unicode字符轉換成str字符的過程。即真實字符→二進制串(unicode→str)
- 解碼:二進制串→真實字符(str→unicode)
事例
- 比如讀入一行中文代碼,要寫入另一個文件時,需要解碼與編碼的變換:
p = "我在博客園“
w.write(p.decode('utf-8').encode('utf-8') + '\n')
解釋:
漢字是已經經過編碼的字符(只有unicode是原始字符串),所以如果想存入電腦系統不太容易直接識別,最保險的辦法就是先解碼成計算機都能夠是別的unicode,再編碼成utf-8的。
- 如果開頭有
coding:utf-8
, 但是還是出現了編碼問題,就可以再加上以下代碼在開頭即可:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
- 解碼實例:
try:
print "unicode('我'):", unicode('我')
except UnicodeDecodeError as e:
# 錯誤信息
# 解析器試圖用ascii編碼來解碼我們傳入的參數,原因就是解析器會先將參數用默認的編碼格式(這裏是utf-8)進行編碼,然後傳給unicode()函數,
print e
str本身是不能encode的,如果想要encode,先要轉化成unicode。
- 解釋:
str.encode()實際上就等價於str.decode(sys.defaultencoding).encode().而sys.defaultencoding一般是ascii,它是不能用來編碼中文字符的。
- 解釋:
sd