Python3的bytes/str之別

 

Python 3最重要的新特性大概要算是對文本和二進制數據做了更爲清晰的區分。文本老是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得二者的區分特別清晰。你不能拼接字符串和字節包,也沒法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然)。這是件好事windows

無論怎樣,字符串和字節包之間的界線是必然的,下面的圖解很是重要,務請牢記於心:ide

 

字符串能夠編碼成字節包,而字節包能夠解碼成字符串。函數

>>>'€20'.encode('utf-8')
b'\xe2\x82\xac20'
>>> b'\xe2\x82\xac20'.decode('utf-8')
'€20'

 

這個問題要這麼來看:字符串是文本的抽象表示。字符串由字符組成,字符則是與任何特定二進制表示無關的抽象實體。在操做字符串時,咱們生活在幸福的無知之中。咱們能夠對字符串進行分割和分片,能夠拼接和搜索字符串。咱們並不關心它們內部是怎麼表示的,字符串裏的每一個字符要用幾個字節保存。只有在將字符串編碼成字節包(例如,爲了在信道上發送它們)或從字節包解碼字符串(反向操做)時,咱們纔會開始關注這點。編碼

傳入encode和decode的參數是編碼(或codec)。編碼是一種用二進制數據表示抽象字符的方式。目前有不少種編碼。上面給出的UTF-8是其中一種,下面是另外一種:code

>>>'€20'.encode('iso-8859-15')
b'\xa420'
>>> b'\xa420'.decode('iso-8859-15')
'€20'

 

編碼是這個轉換過程當中相當重要的一部分。離了編碼,bytes對象b'\xa420'只是一堆比特位而已。編碼賦予其含義。採用不一樣的編碼,這堆比特位的含義就會大不一樣:對象

>>> b'\xa420'.decode('windows-1255')
'₪20'
相關文章
相關標籤/搜索