轉(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)牢記于心:

字符串可以編碼成字節(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)慎。