一篇文章搞懂python二、3編碼

說在前邊:html

  編碼問題一直困擾着每個程序員的編程之路,若是不將它完全搞清楚,那麼你的的這條路必定會走的格外艱辛,尤爲是針對使用python的程序員來講,這一問題更加顯著,python

  由於python有兩個版本,這兩個版本編碼格式卻徹底不一樣,但咱們卻常常須要兼顧這兩個版本,因此出現各類問題的概率就大了不少。程序員

  因此在這裏我試圖用一篇文章來完全梳理整個python語言的編碼問題,儘可能下降之後在這方面舉到問題的可能性。編程

  ps 此文必定程度上參考和引用了alex的博客:「https://www.cnblogs.com/alex3714/articles/7550940.html網絡

說編碼,首先得知道什麼是編碼,爲何會有編碼:編碼

  百度百科上的解釋是:「編碼是信息從一種形式轉換爲另外一種形式的過程」,這實際上是一個過程,而咱們常說的「編碼問題」,其實更多的是指「編碼格式問題」。spa

  常見的編碼格式有:設計

    ASCII  佔一個字節,只支持英文code

    GB2312  佔2個字節,支持6700多個漢字orm

    GBK   GB2312的升級版,支持的漢字更多(21000+漢字)

    Shift-JIS  日本字符

  由於計算機只識別二進制,每一個字符想要被計算機識別,那麼它就須要有字符和二進制之間的對應關係,而每一個國家都有本身的字符,可是也僅包含本國字符,

  致使本國軟件、系統,到了國外就會亂碼,從而爲了解決這一問題,「萬國碼」(Unicode)出現了,它包含了全球全部文字和其二進制的對應關係。

  Unicode 2-4字節,已經收錄了136690+字符,且依舊在擴充。

  它支持全球全部語言,每一個國家都不用使用原先的本國編碼,用Unicode就萬事大吉。

  Unicode解決了字符和二進制之間的對應關係,可是仍有一個問題沒有解決,那就是空間問題,由於Unicode使用2-4個字節標識一個字符,二原先的ASCII碼雖然只支持英文,

  可是一個英文字母只佔1個字節,原先 「Python」 用ASCII佔6字節,如今用Unicode卻要佔12字節,在存儲和網絡傳輸過程當中是很大的負擔,因此推生出另外一種編碼出現:

  "UTF" (Unicode Transformation Format),即對Unicode的轉換,目的是存儲和傳輸過程當中節省空間。

  UTF-8 : 使用 一、二、三、4個字節表示全部字符,優先使用1個字符,沒法知足即增長一個字節,最多使用4字節:英文1字節,歐洲語系2字節,東亞3字節(中文),特殊字符4字節。

  UTF-16: 使用二、4個字節表示全部字符;優先使用2個字節,不然使用4個字節表示。

  UTF-32: 使用4個字節表示全部字符;

  (UTF是爲Unicode編碼格式設計的一種在存儲與運輸時節省空間的編碼方案)

總體編碼背景說完,咱們該來講說python的編碼了:

  因爲最開始出現的時python2,因此咱們從它開始說:

  龜叔當初開發python時,估計沒想到它會這兒的火,因此就將ASCII來看成了默認編碼,因此python中的默認編碼是ASCII.

  

  

  

 

 

   咱們在python中輸入 s = '宋訟頌'後,使用print來打印,確實是「宋訟頌」沒錯,可是當你直接調用s時,卻出現的是一個個的16進製表示的二進制字節,咱們將其稱之爲bytes類型(字節類型)

  咱們打印出它的類型,確是「str」,實際上在 python2中 bytes == str ,而後python2中還有一個單獨的類型,就是unicode,將str解碼後就變成了unicode,而後當你想從unicode編碼轉成gbk編碼時,

  只須要在對其進行編碼,就ok,因此咱們必定要記住,unicode是橋樑,任何兩種編碼想要相互轉換,都須要decode('utf-8')將其先轉爲unicode,再通過encode()轉換爲想要的編碼。

  

python3橫空出世:

  在2008年,python3橫空出世,不兼容python2,字符串變成了unicode, 文件默認編碼變爲了utf-8,意味着只要用python3編寫的代碼,不管程序是以哪一種編碼開發的,任何電腦均可以顯示。

  這時的str和bytes已經不一樣了,str就是unicode格式的字符串,可是bytes就是單純的二進制文件啦。

  

 

   

 

   從這張圖咱們就能夠看到,這時的字符串已是unicode類型了,因此就不能decode()了。

  而bytes已經僅僅表示二進制文件啦。

相關文章
相關標籤/搜索