Python?3中str與bytes的區(qū)分

轉(zhuǎn)載自:http://mp.weixin.qq.com/s/tG1VPhiCCFszCiLROXf5Ug

姓名:梅金波? ? ? ? ? ? ? ? ? 學(xué)號(hào):16010110036

【嵌牛導(dǎo)讀】Python 3最重要的新特性大概要算是對(duì)文本和二進(jìn)制數(shù)據(jù)作了更為清晰的區(qū)分。文本總是Unicode,由str類型表示,二進(jìn)制數(shù)據(jù)則由bytes類型表示。

【嵌牛鼻子】python3中str與bytes的區(qū)別

【嵌牛提問】str與bytes有哪些區(qū)別?

【嵌牛正文】Python 3不會(huì)以任意隱式的方式混用str和bytes,正是這使得兩者的區(qū)分特別清晰。你不能拼接字符串和字節(jié)包,也無法在字節(jié)包里搜索字符串(反之亦然),也不能將字符串傳入?yún)?shù)為字節(jié)包的函數(shù)(反之亦然)。這是件好事。

不管怎樣,字符串和字節(jié)包之間的界線是必然的,下面的圖解非常重要,務(wù)請(qǐng)牢記于心:

圖片發(fā)自簡書App

字符串可以編碼成字節(jié)包,而字節(jié)包可以解碼成字符串。

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

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

這個(gè)問題要這么來看:字符串是文本的抽象表示。字符串由字符組成,字符則是與任何特定二進(jìn)制表示無關(guān)的抽象實(shí)體。

在操作字符串時(shí),我們生活在幸福的無知之中。我們可以對(duì)字符串進(jìn)行分割和分片,可以拼接和搜索字符串。我們并不關(guān)心它們內(nèi)部是怎么表示的,字符串里的每個(gè)字符要用幾個(gè)字節(jié)保存。只有在將字符串編碼成字節(jié)包(例如,為了在信道上發(fā)送它們)或從字節(jié)包解碼字符串(反向操作)時(shí),我們才會(huì)開始關(guān)注這點(diǎn)。

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

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

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

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

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

'?20'

據(jù)說百分之八十的金錢損失皆因使用錯(cuò)誤的編碼導(dǎo)致,因此務(wù)必小心謹(jǐn)慎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容