標籤:python unicode 編碼 byte 二進位 ascii 文本 字串 utf-8
Python 3最重要的新特性大概要算是對文本和位元據作了更為清晰的區分。文本總是Unicode,由str類型表示,位元據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜尋字串(反之亦然),也不能將字串傳入參數為位元組包的函數(反之亦然)。這是件好事。
不管怎樣,字串和位元組包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6D/8E/wKiom1Vl_qHQInFcAABRA4eYcjg362.jpg" title="01QoN7aXN1il.png" alt="wKiom1Vl_qHQInFcAABRA4eYcjg362.jpg" />
圖解,非常重要。
字串可以編碼成位元組包,而位元組包可以解碼成字串。
>>> ‘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‘
引申閱讀: 阿獃學Unicode--編碼
本文出自 “Professor哥” 部落格,請務必保留此出處http://professor.blog.51cto.com/996189/1655816
Python 3 對於字串的資料轉換說明