1. 程式人生 > >字串編碼與Python 3編碼

字串編碼與Python 3編碼

昨天部落格訪問量超過20w了,很高興,也希望這些筆記和文章能夠真正幫到更多的人。對於一個做技術的人來說,分享真的會給自己帶來很多快樂。不過說來也很慚愧,最近兩個月都沒寫什麼新的內容,一直忙於畢業設計和論文的事,也沒學什麼新的東西。不過想到馬上要畢業將要踏上新的征程也是特別興奮的。

關於字串編碼方面的內容很基礎,學了很多次還是記不住,每次要用的時候又去查詢相關資料,很麻煩,這裡做一個總結記錄一下,方便自己下一次查閱,也加深一下記憶(可能是擼多了,記憶力越來越差。。)。

編碼

百度百科上對編碼和解碼的定義如下:編碼是用預先規定的方法將文字、數字或其他物件轉換成數碼的過程。解碼是編碼的逆向。
這裡我們不妨將人類可以很容易理解的訊息作為“明文”,將人類不易懂但是更易於儲存和傳輸的訊息作為“密文”。那麼編碼和解碼的關係如下:
這裡寫圖片描述

因為計算機只能識別0和1,我們人類易於理解的那些符號數字沒辦法直接儲存到計算機中,必須先將這些符號按照事先規定的方式編碼成0/1串才能儲存到計算機或者通過網路進行傳輸。當我們從硬碟或者網路中讀取檔案時,我們讀取到的內容全是0/1串,需要將這些內容按照一定的方式解碼成我們易於理解的明文,然後才能檢視或進行相關的處理。

編碼有一個必要條件是編碼的過程不能丟失任何資訊,我們能夠從密文解碼出和原文完全一樣的內容。

編碼方式

將明文編碼成密文需要按照一定的編碼方式,編碼方式多種多樣,分別對應於不同的字符集。

ASCII

上個世紀60年代,美國製定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定。這被稱為ASCII碼,一直沿用至今。
ASCII碼一共規定了128個字元的編碼,比如空格”SPACE”是32(二進位制00100000),大寫的字母A是65(二進位制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個位元組的後面7位,最前面的1位統一規定為0。

其他編碼

對於英語來說128個字元就已經夠用了,但是對於其他語言來說卻不夠。因此針對不同的語言先後出現了多種編碼方式,例如針對中文的GB2312和GBK編碼,針對中文繁體的Big5編碼等等,這些編碼方式都使用多個位元組表示一個字元。

Unicode

隨著越來越多的編碼方式的出現,急需一種能夠包含全世界所有符號的編碼系統來消滅亂碼,這種編碼系統就叫做Unicode。Unicode只是一套編碼系統,包含所有字符集,卻並不規定編碼後的二進位制程式碼如何儲存。

UTF-32使用4個位元組儲存每一個字元,但是對於英文字元來說,使用ASCII編碼只需1個位元組即可儲存,這極大的浪費了儲存空間。
因此出現了一種變長的編碼方式UTF-8,UTF-8是使用得最廣泛的Unicode編碼實現方式,使用1-4個位元組表示一個字元,根據不同的字元變化長度。比如對於英文字元,1個位元組就夠了,但是對於中文,可能需要2-4個位元組才能儲存。

Base64

Base64是網路上最常見的用於傳輸8Bit位元組程式碼的編碼方式,可用於在HTTP環境下傳遞較長的標識資訊。採用Base64編碼具有不可讀性,可用作簡單的加密方式。

Python 3編碼

以前用Python 2,每次使用中文就會碰到各種編碼問題,但是Python 3使得字串編碼變得非常簡單。

我們可以通過以下程式碼檢視Python 3的字串預設編碼:

import sys
sys.getdefaultencoding()

Python 3的預設編碼方式是UTF-8。

使用Python直譯器進行如下編碼解碼操作,在bytes和str之間轉換:

>>> '中'.encode()
b'\xe4\xb8\xad'
>>> b'\xe4\xb8\xad'.decode('utf-8')
'中'

我們在使用Python以二進位制的形式寫入檔案時,需要先將字串編碼成位元組串,然後再寫入檔案。以二進位制的形式讀取檔案時也是如此,需要將讀取的位元組串解碼成字串。