目錄python
1.編碼的歷史python3.x
2.python 3.x中的bytes與stride
3.編碼的轉換函數
正文開始編碼
1.編碼的歷史與發展spa
1.1編碼歷史變動code
編碼能夠理解爲諜戰片中電報的密碼本,若是要想讓電腦識別要輸入的文本,須要將文本轉換爲電腦能識別的機器語言blog
因爲發明計算機的是美國人,因此最開始的編碼表就是美國人所設定,所設定的這個表就爲ASCII碼,ASCII碼包含字母大小寫、數字以及特殊符號。ASCII碼使用8bit,一個字節表達一個字符,因此作多顯示爲2**8-1個字符,也就是255個字符,例如00000001 autf-8
後面因爲計算機的普遍傳播,ASCII碼已經徹底不能知足人們的平常須要,這個時候就出現了萬國碼,unicode,使用16bit,2個字節表示一個字符,後面使用後發現並不能實現,這個時候就進行了升級,此時採用32bit,也就是四個字節表示一個字符,雖然基本包含了全部的字符,可是,使用這種編碼佔用空間就很大;最終在後期的升級下,採用瞭如今大範圍使用的UTF-8編碼格式,對於英文以及傳統的特殊字符采用ASCII編碼,也就是8bit,一個字節,對於歐洲地區採用16bit,也就是2字節表示一個字符,對於亞洲區域則採用24bit,也就是三個字節顯示一個字符。unicode
過於國內的字符編碼,在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**0 1*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.編碼的轉換
對於編碼的轉換,只須要記住下面這個圖就行了