字符串編碼與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以二進制的形式寫入文件時,需要先將字符串編碼成字節串,然後再寫入文件。以二進制的形式讀取文件時也是如此,需要將讀取的字節串解碼成字符串。


參考文檔:
1. 字符編碼筆記:ASCII,Unicode和UTF-8
2. Python 3的bytes/str之別
3. Python3的編碼問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章