Python2編碼的理解整理
一直以來對Python2的編碼都是不怎麼理解,遇到問題就是encode、decode換著來,也沒有想要過去徹底瞭解它,這幾天也看了幾篇文章,所以就將自己的理解記錄下來,順便也整理一下自己的理解。
這篇文章主要講了一下幾個問題:
- 字符集與字元編碼;
- 字符集(字元編碼)在儲存以及傳輸的實現方式;
- Str與Unicode;
- encode與decode;
一、字符集與字元編碼
字符集基本就算是我們使用的所有文字的集合外加一些常用的符號等,例如,針對ascii字符集,那麼它就是英文字元a-z,A-Z,0-9外加一些常用符號的集合;
字元編碼字元編碼就是將字符集中的每一個字元用數字對應起來,比如,英文字母,’a’用97代替,’A’用65代替;
那麼,為什麼需要?字符集與字元編碼呢?
因為任何資料在計算機儲存都是以二進位制的方式儲存的,若是我們不將每個字元一一對應一個編碼,那麼,我們又這麼儲存資料與展示資料呢!
二、字符集(字元編碼)在儲存以及傳輸的實現方式
(這裡為了節(bi)約(mian)篇(bao)幅(lu)只簡單說一下Unicode字符集)unicode字符集是為了解決各種各樣的語言導致的各種各樣的字符集不相容的問題二出現的,它的目的是給世界上所有的語言文字一個唯一的編碼,這樣就解決了各個字符集不相容的問題,但是,Unicode只是一種字元編碼,並沒有規定它儲存、傳輸時候的方式,這時候UTF-8就出場了。
簡單地說,UTF-8就是一種實現Unicode編碼的方式,當然,還有其它的實現方式,這裡不再贅述,它規定了不同的字元應該用幾個位元組、什麼樣的表示方式描述它的編碼,總的來說就兩條規則:
- 對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。
對於n位元組的符號,第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。
具體如下:
三、Str與Unicode
在Python2中,str型別其實位元組串,Unicode型別才是真正的字串,例如:
var = '學'
type(var)#output:<type 'str'>
repr(var)#output:"'\\xe5\\xad\\xa6'"
var = u'學'
type(var)#output :<type 'unicode'>
repr(var)#output:"u'\\u5b66'"
四、encode與decode
encode就是將字元以某種字符集的實現方式進行編碼,例如,想要將中文的’學’字以UTF-8的方式儲存,那麼我們可以如下操作:
var = u'學'
tmp = var.encode('utf-8')
print tmp #output:'\xe5\xad\xa6'
注意:最好使用unicode字元來encode,這樣可以避免很多麻煩;
decode就是將編碼的位元組串解碼誠Unicode,如下:(接上面部分)
var = u'學'
tmp = var.encode('utf-8')
print tmp #output:'\xe5\xad\xa6'
tmp.deocde('utf-8')#output:u'\u5b66'
print tmp.deocde('utf-8')#output:'學'