1. 程式人生 > >day4-python基礎編碼相關

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**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

回到bytesstr的身上。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原始碼會發現bytesstr擁有幾乎一模一樣的方法列表,最大的區別就是encodedecode

從實質上來說,字串在磁碟上的儲存形式也是01的組合,也需要編碼解碼。

如果,上面的闡述還不能讓你搞清楚兩者的區別,那麼記住下面兩幾句話:

  1. 在將字串存入磁碟和從磁碟讀取字串的過程中,Python自動地幫你完成了編碼和解碼的工作,你不需要關心它的過程。

  2. 使用bytes型別,實質上是告訴Python,不需要它幫你自動地完成編碼和解碼的工作,而是使用者自己手動進行,並指定編碼格式。

  3. Python已經嚴格區分了bytesstr兩種資料型別,你不能在需要bytes型別引數的時候使用str引數,反之亦然。這點在讀寫磁碟檔案時容易碰到。

在bytes和str的互相轉換過程中,實際就是編碼解碼的過程,必須顯式地指定編碼格式。

3.編碼的轉換

對於編碼的轉換,只需要記住下面這個圖就好了

S0OL)R{IYS]~)MT6F)718_A