背景
信息在傳輸過程中實際上是由低電頻與高電頻的組合來表示的,高低電頻對應到計算機中就是數字0與1。所以就可以將若干個0和若干個1組合起來表示一個字符。
例如,我們可以設定0000
表示a
,0001
表示b
,0010
表示c
…
這就像是編寫一個密碼本,每一個密文元素都有其相對應的明文元素。
但是信息傳輸雙方擁有不同加密規則的密碼本,縱使信息成功傳輸與接收,對方也不能知道文本包含的準確信息。所以就要在行業內製定出統一的編碼規則。在這樣的背景下 ASCII 編碼就誕生了。
ASCII
ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256,所以,ASCII碼最多隻能表示 256 個符號。
因爲英文中字母和數字個數很少,ASCII 碼被設計出來的時候,有效位只有7位,一共能表示128 (27)個字符(包含字母與各種符號
)。但是設計者考慮到計算機的發展,又添加了一位,一共8位,可以表示256(28)個字符。所以在 ASCII 二進制編碼中第一位數字都是0。
例如,在 ASCII 碼中:
0000 0000
表示NUL
(NULL空字符)
0010 0001
表示!
0100 0001
表示A
0100 0010
表示B
0110 0001
表示a
ASCII 碼是針對英文字符設定的,在計算機中一個0或者1佔據內存空間爲 1bit
,所以一個英文字符大小爲 8bit
,即 8bit
(比特) = 1byte
(字節)。
- 8
bit
= 1byte
- 1024
byte
= 1KB
- 1024
KB
= 1MB
- 1024
MB
= 1GB
- 1024
GB
= 1TB
然而隨着計算機向全世界普及,原本的 ASCII 碼就無法將世界上的各種文字和符號全部表示了。於是就需要新出一種可以代表所有字符和符號的編碼,即:Unicode。而由 Unicode 的不斷改善發展,又有了 UTF-8 。
UTF-8
Unicode
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,
注:此處說的的是最少2個字節,可能更多
UTF-8
UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存…
在 UTF-8 中一個漢字佔三個字節(24位),英文字母佔一個字節(8位)
GBK
gbk 編碼 中國人自己發明的,一箇中文用兩個字節(16位)去表示,英文字母佔一個字節(8位)
注:
1,各個編碼之間的二進制,是不能互相識別的,會產生亂碼。
2,文件的儲存,傳輸,不能是unicode(只能是utf-8 utf-16 gbk,gb2312,asciid等)
Python3 中的編碼解碼
str 與 bytes
Python3 中的字符串在內存用使用的是Unicode
編碼,是以字符爲單位進行處理的。而在Python3中還有一種數據類型 bytes,是以字節爲單位進行處理的。
bytes 通常用於網絡數據傳輸、二進制圖片和文件的保存等等。可以通過調用bytes()生成bytes實例,其值形式爲 b’xxxxx’,其中 ‘xxxxx’ 爲一至多個轉義的十六進制字符串(單個 x 的形式爲:\x12,其中\x爲小寫的十六進制轉義字符,12爲二位十六進制數)組成的序列,每個十六進制數代表一個字節(八位二進制數,取值範圍0-255),對於同一個字符串如果採用不同的編碼方式生成bytes對象,就會形成不同的值.
s = 'python'
print(s, type(s))
# python <class 'str'>
bs = b'python'
print(bs, type(bs))
# b'python' <class 'bytes'>
s1 = '人生苦短'
print(s1, type(s1))
# 人生苦短 <class 'str'>
# bs1 = b'人生苦短' 這麼寫會報錯,bytes只能包含ASCII碼中的字符
編碼與解碼
str.encode(encoding='UTF-8',errors='strict')
以指定的編碼格式編碼字符串。errors參數可以指定不同的錯誤處理方案。返回編碼後的字符串是一個 bytes 對象。
bytes.decode(encoding="utf-8", errors="strict")
以指定的編碼格式解碼 bytes 對象。默認編碼爲 ‘utf-8’,並返回解碼後的字符串。
s = 'python'
bs_utf = s.encode('utf-8')
print(bs_utf) # b'python'
bs_gbk = s.encode('gbk')
print(bs_gbk) # b'python'
sc = '蛇'
bsc_utf = sc.encode('utf-8')
print(bsc_utf) # b'\xe8\x9b\x87'
bsc_gbk = sc.encode('gbk')
print(bsc_gbk) # b'\xc9\xdf'
print(bs_utf.decode()) # python
print(bs_gbk.decode('gbk')) # python
print(bsc_utf.decode()) # 蛇
print(bsc_gbk.decode('gbk')) # 蛇