Python 3的bytes/str之別(轉載)

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

不管怎樣,字符串和字節包之間的界線是必然的,下面的圖解非常重要,務請牢記于心:



字符串可以編碼成字節包,而字節包可以解碼成字符串。

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

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

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

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

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

>>> b'\xa420'.decode('windows-1255')
'?20'

據說百分之八十的金錢損失皆因使用錯誤的編碼導致,因此務必小心謹慎。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容