【Python3】字符解碼與編碼


編碼種類:

  • ASCII 占1個字節,只支持英文
  • GB2312 占2個字節,支持6700+漢字
  • GBK GB2312的升級版,支持21000+漢字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韓國編碼
  • TIS-620 泰國編碼

由於每個國家都有自己的字符,所以其對應關系也涵蓋了自己國家的字符,但是以上編碼都存在局限性,即:僅涵蓋本國字符,無其他國家字符的對應關系。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進制的對應關系,

  • Unicode 2-4字節,已經收錄136690個字符,並還在一直不斷擴張中...

Unicode 起到了2個作用:

  1. 直接支持全球所有語言,每個國家都可以不用再使用自己之前的舊編碼了,用unicode就可以了。
  2. unicode包含了跟全球所有國家編碼的映射關系

Unicode解決了字符和二進制的對應關系,但是使用unicode表示一個字符,太浪費空間。例如:利用unicode表示“Python”需要12個字節才能表示,比原來ASCII表示增加了1倍。

由於計算機的內存比較大,並且字符串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是存儲和網絡傳輸時一般數據都會非常多,那么增加1倍將是無法容忍的。

為了解決存儲和網絡傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode中的進行轉換,以便於在存儲和網絡傳輸時可以節省空間

  • UTF-8: 使用1、2、3、4個字節表示所有字符;優先使用1個字符、無法滿足則使增加一個字節,最多4個字節。英文占1個字節、歐洲語系占2個、東亞占3個,其它及特殊字符占4個
  • UTF-16: 使用2、4個字節表示所有字符,優先使用2個字節,否則使用4個字節表示。
  • UTF-32: 使用4個字節表示所有字符

總結:UTF是為unicode編碼設計的一種 在存儲和傳輸時節省空間的編碼方案。

無論以什么編碼在內存里顯示字符,存到硬盤上都是2進制。存到硬盤時以何種編碼存在,再從硬盤讀出來時,就必須以何種編碼讀,否則亂碼

編碼的轉換 

雖然有了unicode 和 utf-8 , 但是由於歷史問題,各個國家依然在大量使用自己的編碼,比如中國的windows,默認編碼依然是gbk,而不是utf-8

基於此,如果中國的軟件出口到美國,在美國人的電腦上就會顯示亂碼,因為他們沒有gbk編碼。
若想讓中國的軟件可以正常的在 美國人的電腦上顯示,只有以下2條路可走:

  1. 讓美國人的電腦上都裝上gbk編碼
  2. 把你的軟件編碼以utf-8編碼

第1種方法幾乎不可能實現,第2種方法比較簡單。 但是也只能是針對新開發的軟件。 如果你之前開發的軟件就是以gbk編碼的,上百萬行代碼可能已經寫出去了,重新編碼成utf-8格式也會費很大力氣。

所以 , 針對已經用gbk開發完畢的項目,以上2種方案都不能輕松的讓項目在美國人電腦上正常顯示,難道沒有別的辦法了么?
有, unicode其中一個功能是其包含了跟全球所有國家編碼的映射關系,你寫的是gbk的“好好學習”,unicode能自動知道它在unicode中的“好好學習”的編碼是什么,這意味着,無論以什么編碼存儲的數據 ,只要軟件把數據從硬盤讀到內存里,轉成unicode來顯示,就可以了。
由於所有的系統、編程語言都默認支持unicode,那gbk軟件放到美國電腦 上,加載到內存里,變成了unicode,中文就可以正常展示

unicode與gbk的映射表 http://www.unicode.org/charts/

Python3的執行過程:

  1. 解釋器找到代碼文件,把代碼字符串按文件頭定義的編碼加載到內存,轉成unicode
  2. 把代碼字符串按照語法規則進行解釋,
  3. 所有的變量字符都會以unicode編碼聲明,默認文件編碼是utf-8

str=u'好好學習天天向上'   #加u表示unicode,默認也是unicode

utf-8_to _gbk = str.decode('utf-8').encode('gbk')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM