day4-python基礎編碼相關
目錄
1.編碼的歷史
2.python 3.x中的bytes與str
3.編碼的轉換
正文開始
1.編碼的歷史與發展
1.1編碼歷史變更
編碼可以理解為諜戰片中電報的密碼本,如果要想讓電腦識別要輸入的文字,需要將文字轉換為電腦能識別的機器語言
由於發明計算機的是美國人,所以最開始的編碼表就是美國人所設定,所設定的這個表就為ASCII碼,ASCII碼包含字母大小寫、數字以及特殊符號。ASCII碼使用8bit,一個位元組表達一個字元,所以做多顯示為2**8-1個字元,也就是255個字元,例如00000001 a
後面由於計算機的廣泛傳播,ASCII碼已經完全不能滿足人們的日常需要,這個時候就出現了萬國碼,unicode,使用16bit,2個位元組表示一個字元,後面使用後發現並不能實現,這個時候就進行了升級,此時採用32bit,也就是四個位元組表示一個字元,雖然基本包含了所有的字元,但是,使用這種編碼佔用空間就很大;最終在後期的升級下,採用了現在大範圍使用的UTF-8編碼格式,對於英文以及傳統的特殊字符采用ASCII編碼,也就是8bit,一個位元組,對於歐洲地區採用16bit,也就是2位元組表示一個字元,對於亞洲區域則採用24bit,也就是三個位元組顯示一個字元。
過於國內的字元編碼,在unicode和utf-8沒有大規模使用的期間,我國有自己的一套獨立的編碼格式,由最開始的GB2312到後面的GBK在到最新的GB18130,對於國內的編碼的格式主要是,英文等傳統特殊符號採用ASCII碼就行,對於中文則採用16bit,也就是2位元組表示,這樣就造成不同國家不同的字元規格。
例項
'old男孩'在GBK中是7位元組,在utf-8是9位元組
在python 2.7版本中,預設為ASCII碼,不支援中文,如果需要輸入中文必須在文首輸入以下
# -*- encoding:utf-8 -*-
1.2進位制的區別
進位制主要有二進位制,八進位制,十進位制,十六進位制
二進位制:只有01
八進位制:0-7
十進位制:0-9
十六進位制:0-E
1.2.1二進位制轉十進位制以及十進位制轉換二進位制
二進位制轉化成十進位制 1101 ---> 0*2**7+0*2**6+1*2**5+0*2**4+1*2**3+1*2**2+0*2**1+1*2**01*2**5+1*2**3+1*2**2+1*2**0 = 32 + 8 + 4 + 1 = 45 十進位制轉化成二進位制 : 對2取餘,逆向排列 ——-> 0010 1010
2.python3.x中的bytes與str
回到bytes
和str
的身上。bytes
是一種位元流,它的存在形式是01010001110這種。我們無論是在寫程式碼,還是閱讀文章的過程中,肯定不會有人直接閱讀這種位元流,它必須有一個編碼方式,使得它變成有意義的位元流,而不是一堆晦澀難懂的01組合。因為編碼方式的不同,對這個位元流的解讀也會不同,對實際使用造成了很大的困擾。下面讓我們看看Python是如何處理這一系列編碼問題的:
>>> s = "中文"
>>> s
'中文'
>>> type(s)
<class 'str'>
>>> b = bytes(s, encoding='utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
從例子可以看出,s
是個字串型別。Python有個內建函式bytes()
可以將字串str
型別轉換成bytes
型別,b
實際上是一串01的組合,但為了在ide環境中讓我們相對直觀的觀察,它被表現成了b'\xe4\xb8\xad\xe6\x96\x87'
這種形式,開頭的b
表示這是一個bytes
型別。\xe4
是十六進位制的表示方式,它佔用1個位元組的長度,因此”中文“被編碼成utf-8
後,我們可以數得出一共用了6個位元組,每個漢字佔用3個,這印證了上面的論述。在使用內建函式bytes()
的時候,必須明確encoding
的引數,不可省略。
我們都知道,字串類str
裡有一個encode()
方法,它是從字串向位元流的編碼過程。而bytes
型別恰好有個decode()
方法,它是從位元流向字串解碼的過程。除此之外,我們檢視Python原始碼會發現bytes
和str
擁有幾乎一模一樣的方法列表,最大的區別就是encode
和decode
。
從實質上來說,字串在磁碟上的儲存形式也是01的組合,也需要編碼解碼。
如果,上面的闡述還不能讓你搞清楚兩者的區別,那麼記住下面兩幾句話:
-
在將字串存入磁碟和從磁碟讀取字串的過程中,Python自動地幫你完成了編碼和解碼的工作,你不需要關心它的過程。
-
使用
bytes
型別,實質上是告訴Python,不需要它幫你自動地完成編碼和解碼的工作,而是使用者自己手動進行,並指定編碼格式。 -
Python已經嚴格區分了
bytes
和str
兩種資料型別,你不能在需要bytes
型別引數的時候使用str
引數,反之亦然。這點在讀寫磁碟檔案時容易碰到。
在bytes和str的互相轉換過程中,實際就是編碼解碼的過程,必須顯式地指定編碼格式。
3.編碼的轉換
對於編碼的轉換,只需要記住下面這個圖就好了