亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

編碼的秘密(python版)

 

編碼(Python版)

最近在學習Python的過程中,被不同的編碼搞得有點暈,于是看了前人的留下的文檔,加上自己的理解,準備寫下來,分享給正在為編碼苦苦了掙扎的你。

編碼的概念

編碼就是將信息從一種格式轉(zhuǎn)換成另一種格式,計算機只認識二進制,簡單的理解,將我們眼睛看到的文字轉(zhuǎn)換為計算機能夠識別的二進制格式視為編碼,而二進制以某種編碼格式轉(zhuǎn)換為我們能看的文字的過程可以看成是解碼。既然計算機只能認識二進制0,1,那么我們用的字母、數(shù)字和文字等是怎樣和他們對應的呢?那就請繼續(xù)看吧!

Python中查看默認的編碼規(guī)范是:

編碼的秘密(python版)

ASCⅡ碼

我們都知道計算機是米國發(fā)明的,起初的時候也只有米國那些國家使用,而他們的語言僅僅只有26個字母組成,再加上一些符號,所以在一開始的時候,用的編碼規(guī)則就是ASCⅡ碼。ASCⅡ,中文名叫美國信息交換標準代碼,因為名叫American Standard Code for Information Interchange,下面我們來看看ASCⅡ表:

編碼的秘密(python版)

ASCⅡ碼用一個字節(jié),也就是8位二進制組來標識一個字符,比如00100001就代表字符?!,第一版的ASCⅡ沒有用到最高的一個bit,所以取值范圍為0-127,只能表示128字符。為了滿足西歐等國家的字符要求,于是用上了最高位的bit,能表示的字符也從128增加到了256個。

編碼的秘密(python版)

在Python中使用函數(shù)ord(),可以字符轉(zhuǎn)換為對應數(shù)值,使用函數(shù)chr可以將數(shù)值轉(zhuǎn)換為對應字符:

編碼的秘密(python版)

GB2312和GBK

當計算機漂洋過海來到了中國,ASCⅡ已經(jīng)不能滿足我大天朝的需求了,常用的漢字大致都有2k-3k。所以中國國家標準總局在1980發(fā)布了《信息交換用漢字編碼字符集》,也就是GB2313標準。GB2312一共收錄了7445個字符(6763個漢字和682個其他符號),包括拉丁字母、希臘字母和日文平假名等,基本上滿足了國人的需求。

在GB2312中每個漢字使用兩個字節(jié)來表示,分為高字節(jié)和低字節(jié),漢字區(qū)高字節(jié)從B0-F7,低字節(jié)從A1-FE,占用的碼位是72*94=6768,其中有5個空位是D7FA-D7FE,規(guī)定第一個字節(jié)大于127的就代表這是一個漢字的開始(這一個字節(jié)和下一個字節(jié)就代表一個漢字),?每個字節(jié)的最高位都位1。

但是對于人名、古漢語等方面出現(xiàn)的罕用字,GB2312不能處理,后來就出現(xiàn)了GBK。GBK向下兼容GB2312,其編碼范圍從8140到FEFE(不包括xx7F),共23940個碼位,共收錄了21003個漢字,這還是很厲害的了?,F(xiàn)在我們使用的計算機默認的就是GBK編碼。

編碼的秘密(python版)

Unicode和UTF-8

我們國家搞出了GBK,其他的國家也搞出了各種各樣的編碼,比如小日本的SJIJ,寶島臺灣的BIG5,國際組織一看,這不行啊,每個地方都各自搞各自的,那么在不同的國家之間就會出現(xiàn)不兼容,我用GBK編碼格式寫的軟件,弄到你編碼格式為SJIJ的計算機就不能執(zhí)行了。所以就出現(xiàn)了Unicode,也稱萬國碼。unicode是用2個字節(jié)來表示一個字符的,65536類個字符,這足以覆蓋世界上所有的文字。

這樣雖好,但是美國人民就不開心了,我一個字母,比如'a'就需要占用一個字節(jié),現(xiàn)在需要占用兩個字節(jié),這樣就大大的浪費了內(nèi)存和硬盤的空間,所有后來就出現(xiàn)了UTF-32,UTF-16和UTF-8,前兩個這里就不在敖述了,現(xiàn)在并不常用,我們這看看這個UTF-8,UTF-8是一種可變長的編碼格式,存儲英文字母只需要一個字節(jié),存儲漢字需要3個字節(jié),但超大字符集中的更大多數(shù)漢字要占4個字節(jié)。我們在內(nèi)存里面的數(shù)據(jù)是unicode,在傳輸數(shù)據(jù)和保存數(shù)據(jù)的時候適用UTF-8已節(jié)省空間和帶寬。

Python2的編碼

在Python2中默認的編碼是ASCII,Python2的字符串類型有兩種:str和Unicode,這兩個只是字符串類型的名字,我們主要看它們在內(nèi)存里面的內(nèi)存地址:

編碼的秘密(python版)

編碼的秘密(python版)

在Python2中,str類型字符串類型在內(nèi)存中存儲的是bytes數(shù)據(jù),Unicode類型字符串在內(nèi)存中存儲的是unicode數(shù)據(jù)。那兩種數(shù)據(jù)之間是什么關系了?這里就涉及到了解碼(encode)和編碼(decode)了。

編碼的秘密(python版)

由上運行結果可知,unicode轉(zhuǎn)換為bytes數(shù)據(jù)的過程是編碼。從bytes數(shù)據(jù)轉(zhuǎn)換為unicode數(shù)據(jù)的過程是解碼。我們再來看一下:

編碼的秘密(python版)

我們可以看到得到一堆亂文,name存在內(nèi)存里的時候是以UTF編碼成的bytes數(shù)據(jù),而我們這里decode('big5')使用big5來解碼,雖然成功了,但是輸出結果卻不是我們想要的結果。

當我們把第一行coding改為big5的時候就不會出現(xiàn)亂文了,

編碼的秘密(python版)

所以我們用什么規(guī)則編碼的就要用什么區(qū)解碼!

編碼的秘密(python版)

注意:我們在終端顯示出來的明文,就是你用戶所看到的,其實都是已經(jīng)轉(zhuǎn)換成unicode到內(nèi)存里面,而bytes數(shù)據(jù)一般都是計算機識別的。

Python3的編碼

在Python3中也定義了2種類型的字符串類型,str和bytes,str類型存儲unicode數(shù)據(jù),bytes類型存儲bytes數(shù)據(jù)。

編碼的秘密(python版)

編碼的秘密(python版)

如上運行結果,bytes轉(zhuǎn)換為unicode為解碼,uicode轉(zhuǎn)為bytes數(shù)據(jù)類型為編碼。

編碼的秘密(python版)

由上圖所示,在不同的編碼之間轉(zhuǎn)換的時候,我們都要經(jīng)過unicode這個中轉(zhuǎn)站,沒辦法,雖然unicode老大哥強大呢,當我們想把utf-8編碼的數(shù)據(jù)轉(zhuǎn)換為gbk的,我們就需要把utf-8的數(shù)據(jù)先解碼成unicode,再由unicode編碼成gbk。

在py2和py3中有個重要的區(qū)分就是,py2會自動把bytes數(shù)據(jù)解碼成unicode,而py3就不會自動把bytes解碼成unicode了。所以說py3更清晰的區(qū)分了bytes數(shù)據(jù)和unicode。

編碼的秘密(python版)

編碼的秘密(python版)

一個.py文件的"一生"

那我們創(chuàng)建.py文件,到執(zhí)行.py文件,這里面的編碼和解碼是怎么來的呢?

1.當我們創(chuàng)建一個.py文件的時候,會有一個默認的編碼格式(這里以pycharm為例),在右下角,默認是UTF-8,當然你也可以選擇其他的編碼:

編碼的秘密(python版)

2.當我們在.py文件里面寫入代碼的時候,會以unicode的編碼格式保存在內(nèi)存中;

編碼的秘密(python版)

3.當我們保存的時候,會將Unicode數(shù)據(jù)編碼成utf-8格式的數(shù)據(jù),然后保存在硬盤里面;

4.當我們執(zhí)行文件的時候,pycharm會調(diào)用Python的解釋器來讀取文件,在py2中,默認會以ASCII將代碼解碼成unicode數(shù)據(jù),但是ASCII碼并不認識中文,所以就會出現(xiàn)報錯。

編碼的秘密(python版)

所以,在py2中,我們需要加上:

編碼的秘密(python版)

但是在py3中就不存在這個問題了,只要編碼的時候適用的是UTF-8,Python3默認的編碼規(guī)范就是UTF-8,它會用UTF-8來將UTF-8的bytes數(shù)據(jù)解碼成unicode,然后在計算機終端顯示!

相關新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡安全、云原生、Go、Python開發(fā)專業(yè)人才培訓機構!