Python 編碼與解碼

2022-06-05 20:54:12 字數 2670 閱讀 6765

字串型別是對人類友好的符號,但計算機只認識一種符號,那就是二進位制(binary)數,或者說是數字。

為了用計算機可以理解的數字描述人類使用的字元,我們需要一張數字與字元對應的表。我們都知道在計算機中 1 byte = 8bits,可以儲存 0~255共256個值,也就是說 1byte最多可以表示 256 個字元,在最初的計算機世界中,256 足以容納所有大小寫英文本和阿拉伯數字 0~9以及一些常用的符號,於是就有了 ascii 編碼:

ascii碼有乙個問題,表示英文夠用了,但是無法表示中文俄文拉丁文等等。跨語言、跨平台進行文字轉換、使用不同的編碼格式解析同一串二進位制數會出現完全不一樣的解釋,也就是亂碼。

能不能將全世界所有的字元包含在乙個集合裡,計算機只要支援這乙個字符集,就能顯示所有的字元,再也不會有亂碼了?於是unicode出現了,unicode也叫統一碼、萬國碼、單一碼。

unicode很好的支援了多語言環境,避免了亂碼的問題。不過它也有確定,它的優點是「全」,伴生著缺點就是「大」。ascii編碼是1個位元組,而unicode編碼通常是2個位元組。

於是新的問題又出現了:如果統一成unicode編碼,亂碼問題從此消失了。但是,如果你寫的文字基本上全部是英文的話,用unicode編碼比ascii編碼需要多一倍的儲存空間,在儲存和傳輸上就十分不划算。

所以,本著節約的精神,又出現了把unicode編碼轉化為「可變長編碼」的utf-8編碼。utf-8編碼把乙個unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文本母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文本元,用utf-8編碼就能節省空間。

utf-8編碼有乙個額外的好處,就是ascii編碼實際上可以被看成是utf-8編碼的一部分,所以,大量只支援ascii編碼的歷史遺留軟體可以在utf-8編碼下繼續工作。

在計算機記憶體中,統一使用unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為utf-8編碼,用記事本編輯的時候,從檔案讀取的utf-8字元被轉換為unicode字元到記憶體裡,編輯完成後,儲存的時候再把unicode轉換為utf-8儲存到檔案。

python 3最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示。python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜尋字串(反之亦然),也不能將字串傳入引數為位元組包的函式(反之亦然)。這是件好事。

python3中有bytes和string型別:

bytes主要是給在計算機看的,string主要是給人看的

中間有個橋梁就是編碼規則,現在大趨勢是utf8

bytes物件是二進位制,很容易轉換成16進製制,例如\x64

string就是我們看到的內容,例如』abc』

string經過編碼encode,轉化成二進位制物件,給計算機識別, 也就是bytes型別

bytes經過反編碼decode,轉化成string,但是注意反編碼的編碼規則是有範圍,\xc8就不是utf8識別的範圍

>>> '€20'.encode('utf-8')

b'\xe2\x82\xac20' # bytes物件,二進位制

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

'€20'

>>>'hello'.encode('utf-8')

b'hello'

>>>b'hello'.decode('utf-8')

'hello'

不管怎樣,字串和位元組包之間的界線是必然的,下面的**非常重要,務請牢記於心:

字串(string)由字元組成,字元也是抽象的實體且與任何二進位制表示無關。

當操縱字串的時候,很多細節是不用了解的。我們可以分割、切片和拼接字串,在字串內部進行搜尋。但並不在乎內部是如何表示的,也不用在意底層乙個字元要花費多少byte。

只有在需要將string編碼(encode)成byte的時候,比如:通過網路傳輸資料;或者需要將byte解碼(decode)成string的時候,我們才會關注string和byte的區別。

s = '你是誰'

# 編碼

# 得出的 a 的結果就是對應的位元組

a = bytes(s,'utf-8')

print(a)

# 該命令將字串轉換為位元組形式

b = s.encode('utf-8')

print(b)

# 下面是解碼

# 將位元組包轉換成字串

c = b'\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81'

print(c.decode())

如果對python測試開發相關技術感興趣的夥伴,歡迎加入測試開發學習交流qq群:696400122,不積跬步,無以至千里。

編碼與解碼 python 經驗

位元 bit 也稱二進位制位,指二進位制中的一位,是計算機資訊的最小單位。bit是binary digit 二進位制數字 的縮寫,還可被縮寫為b。位元組 港澳台稱位元組,byte 乙個位元組代表8個位元,也被縮寫為b,在工業標準 網路 電信技術中也被成為八位組 octet 字面量,可以理解為給人看的...

python的編碼與解碼

1.特殊情況 xe5 xae x9d xe9 x python2控制台bai輸出會有這種情況,包括以下list裡面的漢字雖du然是utf8格式的但仍然zhi不可見中文。只需要包要檢視的list轉為str並decode string escape 例子為 li 33,39 寶馬 36,39 馬 pri...

python的編碼與解碼

python中的字元型別 python中的字元型別分兩種 1.str型別 ascii表中的字元,佔乙個位元組,所以也叫位元組字元。字面量用雙引號表示。s ok,u u 我,u1 u 我 u2 u 愛python print s s print u1 u1 print u2 u2 解析器通常把unic...