Python3的bytes/str之別


原文:The bytes/str dichotomy in Python 3

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

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

enter image description here

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

>>>'€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'

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM