Python基礎:編碼表和字符的故事

在計算機內部,都是每8位組成的一個個字節,比如我們使用"abc".encode()把abc轉化成二進制byte類型,注意byte是不可變類型:
在這裏插入圖片描述

編碼過程

>>> abc.encode() 
 
# 把str字符變爲bytes字節類型;字符是一個個連接的,轉化出來的bytes也是一個個連續的。
b'abc'
>>> "阿".encode("utf-8")  # 一個漢字 uft-8裏多是3個字節
b'\xe9\x98\xbf'
>>> "阿".encode("gbk")  # 一個漢字 gbk裏是2個字節
b'\xb0\xa2'

解碼過程

>>> b'\xe9\x98\xbf'.decode() #使用默認的utf-8 進行解碼
'阿'
>>> b'\xb0\xa2'.decode("gbk") # 因爲剛纔是用gbk編碼的,我們就用gbk解碼,否則就會亂碼
'阿'
>>> b'abc'.decode()
#  **這裏要注意不要看這裏的abc**,這裏的abc只是一種展現形式,
#因爲這只是二進制的展示形式
'abc'

ASCII 碼

從0到127,共128種變化。它是用1個字節(1個字節有8位)表示的。
關於8位,就是從0000 0000到1111 1111組成的數字,最高位不動,剩下的低7位變化,所以共有(2的8次方,1 0000 0000,即128)種狀態,即0-127,其中127對應的就是0FFF FFFF。

爲了用計算機表達字符,人們建了對照表。
比如1,對於計算機來說,計算機裏原本是0000 0001,我們告訴計算機不要把0100 0001當65看了,請把它當a看

類似這樣比較常見建議背誦的有:

  • 09>>> TAB
>>> c = "\t" # 轉義字符的tab
>>> c
'\t'
>>> c = "\x09" # 十六進制的9
>>> c
'\t'
  • 0d0a >>> 回車換行 # 即十進制的1310
>>> d = "\r\n"
>>> d
'\r\n'
>>> d = "\x0d\x0a"
>>> d
'\r\n'
  • 0x20>>>空格 即decimal 32
>>> e = " "
>>> e
' '
>>> e = "\x20"
>>> e
' '
  • 阿拉伯數字0x31 >>>字符1 即decimal 49
>>> c =1 # 整數1與ascii碼錶無關
>>> d = "1" # 字符1,那就要查表
>>> d
'1'
>>> d = "\x31"
>>> d
'1'
  • A >>> 0x41 即 65

  • a>>> 0x61 即97

>>> x = "\x41"
>>> x
'A'
>>> y = "\x61"
>>> y
'a'
# 舉例
>>> z = "a\x09b\x0d\x0ac \x31\x41\x61" 
# 相當於z = 'a\tb\r\nc 1Aa'
>>> z
'a\tb\r\nc 1Aa'

單字節的故事:歐美國家

ASCII碼0-127低8位解決了英語問題,歐洲法國德國俄國西班牙等,就用了高8位,各自解決了自己的信息化問題:即低8位兼容ascii碼,高8位各自爲政 高八位加低八位共一個字節。

雙字節的中文GB2312>>GBK

僅僅能夠解決英美國家拉丁文等字母文字的編碼,但無法解決中文體系的方塊字,因爲方塊字的數量太多了。一個字節不夠,於是我們開始使用2個字節即65536種狀態表達漢字。
爲了兼容ASCII碼,漢字是把雙字節的每一個0x80之前的都讓過的。比如啊,\xb0\xa1,每個字節都高於0x800x80。
GB2312漢字數量較少(也包含了部分日文),最後發展成了GBK,現在window內部使用額就是雙字節的GBK。

雙字節的統一:unicode

Unicode和iso都可以實現用雙字節把全世界已知字符收錄,後來合二爲一成爲Unicode。
Unicode和GBK之間存在映射關係

互聯網時代,雙字節的進化-utf-8

Unicode始終是雙字節,這樣本來用單字節表達的字母,也需要用雙字節,影響了網絡時代的網絡傳輸。
於是適應網絡時代的utf-8出現了,utf-8有1-6個字節兼容了所有字節,ascii碼依然是單字節;中文字符大多落在3個字節。

last not the least: str在字符的世界中,是有編碼的,要查編碼表;
bytes在字節的世界裏,只有一個個字節,沒有編碼。

今日雞湯: 標準之爭纔是至高爭奪。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章