python的編碼問題

基本概念

  • 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'
  1. str是字節串,由unicode經過編碼(encode)後的字節組成的
  2. unicode纔是真正意義上的字符串,由字符組成

    • 思路:搞明白要處理的是str還是unicode, 使用對的處理方法(str.decode//or//unicode.encode)
    • 簡單原則:不要對str使用encode,不要對unicode使用decode (事實上可以對str進行encode的,具體見最後,爲了保證簡單,不建議)

簡記

  • encode是編碼,decode是解碼
  • 編碼:採用一定的編碼格式將unicode字符轉換成str字符的過程。即真實字符→二進制串(unicode→str)
  • 解碼:二進制串→真實字符(str→unicode)

事例

  1. 比如讀入一行中文代碼,要寫入另一個文件時,需要解碼與編碼的變換:
p = "我在博客園“
w.write(p.decode('utf-8').encode('utf-8') + '\n') 

解釋:
漢字是已經經過編碼的字符(只有unicode是原始字符串),所以如果想存入電腦系統不太容易直接識別,最保險的辦法就是先解碼成計算機都能夠是別的unicode,再編碼成utf-8的。

  1. 如果開頭有coding:utf-8, 但是還是出現了編碼問題,就可以再加上以下代碼在開頭即可:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
  1. 解碼實例:
try:
    print "unicode('我'):", unicode('我')
except UnicodeDecodeError as e:
    # 錯誤信息
    # 解析器試圖用ascii編碼來解碼我們傳入的參數,原因就是解析器會先將參數用默認的編碼格式(這裏是utf-8)進行編碼,然後傳給unicode()函數,
    print e
  1. str本身是不能encode的,如果想要encode,先要轉化成unicode。

    • 解釋:
      str.encode()實際上就等價於str.decode(sys.defaultencoding).encode().而sys.defaultencoding一般是ascii,它是不能用來編碼中文字符的。
  2. sd

發佈了35 篇原創文章 · 獲贊 16 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章