ASCII, Unicode , GBK, UTF-8
上面這四個東東是兩個層面上的東西,不能混為一談辈讶。
ASCII和Unicode一類摊腋,都是一種字符編碼標準辖众,里面包含了字符集,編碼格式载荔。既然是標準盾饮,那么就是一種約定俗成的東西。
這是廣義上的定義懒熙,我們一般說的ASCII和Unicode是指字符集丘损。
GBK和UTF-8對等,它們分別是ASCII和Unicode兩種標準下的一種編碼格式工扎。
編碼格式是用來存儲和傳輸?shù)呐窃浚糜趯⒆址械腸ode point轉(zhuǎn)化為機器碼(二進制碼)
Python 2.x str & unicode
python里的unicode就不是上面所說的標準或者字符集了,而是python定義的一種類型肢娘。
str可以認為是編碼之后的字符串呈础,它可以通過encode和decode這兩個方式實現(xiàn)和unicode的相互轉(zhuǎn)換舆驶。
注意:str的編碼格式,如果是在解釋器中輸入的而钞,則取決于解釋器的默認編碼沙廉,比如是在iterm中運行解釋器,那么編碼格式就由iterm的編碼格式?jīng)Q定臼节;如果是保存到文件中的撬陵,則取決于文件保存的編碼格式,比如文件的編碼格式是utf-8 网缝,那么解釋器讀取str的時候就是utf-8de編碼格式巨税。
encode和decode
# -*- coding: utf-8 -*-
s = '知行合一'
# s是一個utf-8格式的字符串
us = s.decode('utf-8')
# s被解碼為unicode對象,賦值給us
ss = us.encode('gbk')
# us被編碼成gbk格式的字符串粉臊,賦值給ss
但是事實情況要比這個復雜垢夹,比如看如下代碼:
# -*- coding: utf-8 -*-
s = "知行合一"
s.encode('gbk')
看!str也能編碼维费,(事實上unicode對象也能解碼果元,但是意義不大)
為什么可以這樣呢?其實str還是做了解碼操作犀盟,只是這里的解碼操作被隱藏起來了而晒。流程還是和上面的一樣,當對s進行編碼之前阅畴,先會用默認的編碼對s進行解碼倡怎,再用解碼之后的unicode對象進行編碼。
這就引出了python2.x中在處理中文時贱枣,大多數(shù)出現(xiàn)錯誤的原因所在:python的默認編碼监署,defaultencoding是ascii
還是上面的例子,上面的代碼會報錯纽哥,錯誤信息:UnicodeDecodeError: ‘a(chǎn)scii’ codec can’t decode byte ……
因為沒有指定defaultencoding钠乏,所以它其實是在做這樣的事情
# -*- coding: utf-8 -*-
s = "知行合一"
s.decode('ascii').encode('gbk')
顯然中文字符超出了ASCII字符集的范圍,出現(xiàn)解碼錯誤
解決方法:
在文件的頭部用# -*- coding:utf-8 -*-指明編碼格式春塌,并且保存文件的時候要選擇相同的編碼格式晓避。