ASCII,UTF-8,GBK 及 Python3中的編碼解碼

背景

信息在傳輸過程中實際上是由低電頻與高電頻的組合來表示的,高低電頻對應到計算機中就是數字0與1。所以就可以將若干個0和若干個1組合起來表示一個字符。

例如,我們可以設定0000表示a0001表示b0010表示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(字節)。

  • 8bit = 1byte
  • 1024byte = 1KB
  • 1024KB = 1MB
  • 1024MB = 1GB
  • 1024GB = 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'))  # 蛇
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章