[TOC]
昨天博客訪問量超過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](http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)?
2.?[Python 3的bytes/str之別](http://www.ituring.com.cn/article/1116)?
3.?[Python3的編碼問題](http://blog.sina.com.cn/s/blog_6d7cf9e50102vo90.html)
- 空白目錄
- serial
- serial 整理
- hex to str
- Python3 字符編碼
- 字符串編碼與Python 3編碼
- python3中bytes和string之間的互相轉換
- Python3 字符編碼
- python整數、字符串、字節串相互轉換
- python整數、字符串、字節串相互轉換
- python常用的十進制、16進制、字符串、字節串之間的轉換(長期更新帖)
- python中pyserial模塊使用方法
- 談談 Python 程序的運行原理
- flask
- Flask 在 Debug 模式下初始化2次
- Flask中向前端傳遞或者接收Json文件的方法
- 使用 Python 和 Flask 設計 RESTful API
- 使用 Flask-RESTful 設計 RESTful API