Python有哪幾種編碼方式?這幾類必須知道!

老男孩IT教育機構發表於2021-06-07

  Python有哪幾種編碼方式?主要包含ASCII、GBK、Unicode與utf8幾類,接下來我們一起來認識一下!

  ASCII表

  眾所周知,計算機起源於美國,英文只有26個字元,算上其他所有特殊符號也不會超過128個。位元組是計算機的基本儲存單位,一個位元組(bytes)包括八個位元位(bit),能夠表示出256個二進位制數字,所以美國人在這裡只是用到了一個位元組的前七位即127個數字來對應了127個具體字元,而這張對應表就是ASCII碼字元編碼表,簡稱ASCII表。後來為了能夠讓計算機識別拉丁文,就將一個位元組的最高位也應用了,這樣就多擴充套件出128個二進位制數字來對應新的符號。這張對應表因為是在ASCII表的基礎上擴充套件的最高位,因此稱為擴充套件ASCII表。到此位置,一個位元組能表示的256個二進位制數字都有了特殊的符號對應。

  GBK編碼

  但是,當計算機發展到東亞國家後,問題又出現了,像中文,韓文,日文等符號也需要在計算機上顯示。可是一個位元組已經被西方國家佔滿了。於是,我中華民族自己重寫一張對應表,直接生猛地將擴充套件的第八位對應拉丁文全部刪掉,規定一個小於127的字元的意義與原來相同,即支援ASCII碼錶,但兩個大於127的字元連在一起時,就表示一個漢字,這樣就可以將幾千個漢字對應一個個二進位制數了。而這種編碼方式就是GB2312,也稱為中文擴充套件ASCII碼錶。再後來,我們為了對應更多的漢字規定只要第一個位元組是大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴充套件字符集裡的內容。這樣能多出幾萬個二進位制數字,就算甲骨文也能夠用了。而這次擴充套件的編碼方式稱為GBK標準。當然,GBK標準下,一個像”苑”這樣的中文符號,必須佔兩個位元組才能儲存顯示。

  Unicode與utf8編碼

  與此同時,其它國家也都開發出一套編碼方式,即本國文字元號和二進位制數字的對應表。而國家彼此間的編碼方式是互不支援的,這會導致很多問題。於是ISO國際化標準組織為了統一編碼,統計了世界上所有國家的字元,開發出了一張萬國碼字元表,用兩個位元組即六萬多個二進位制數字來對應。這就是Unicode編碼方式。這樣,每個國家都使用這套編碼方式就再也不會有計算機的編碼問題了。Unicode的編碼特點是對於任意一個字元,都需要兩個位元組來儲存。這對於美國人而言無異於吃上了世界的大鍋飯,也就是說,如果用ASCII碼錶,明明一個位元組就可以儲存的字元現在為了相容其他語言而需要兩個位元組了,比如字母I,本可以用01001001來儲存,現在要用Unicode只能是00000000 01001001儲存,而這將導致大量的空間被浪費掉。基於此,美國人建立了utf8編碼,而utf8編碼是一種針對Unicode的可變長字元編碼方式,根據具體不同的字元計算出需要的位元組,對於ASCII碼範圍的字元,就用一個位元組,而且符號與數字的對應也是一致的,所以說utf8是相容ASCII碼錶的。但是對於中文,一般是用三個位元組儲存的。

  編碼和解碼區分:

  s = "苑昊"

  b1 = s.encode()

  b2 = s.encode("GBK")

  print(b1) # 預設utf8 : b'\xe8\x8b\x91\xe6\x98\x8a'

  print(b2) # b'\xd4\xb7\xea\xbb'

  print(b1.decode()) # 這裡如果用GBK解碼就會出現亂碼

  print(b2.decode("GBK"))

  print(type(b1)) #

  print(type(b2)) #

  Python 3 最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分,不再會對bytes位元組串進行自動解碼。文字總是Unicode,由str型別表示,二進位制資料則由bytes型別表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2775812/,如需轉載,請註明出處,否則將追究法律責任。

相關文章