想要完全搞清楚編碼問題,咱們必需要先搞清楚計算機是怎麼存儲數據的,這就涉及到了計算機基礎的幾個概念了,開篇咱們就先來捋捋這幾個容易混淆的概念。html
二進制位, 是計算機內部數據儲存的最小單位,11010100是一個8位二進制數。一個二進制位只能夠表示0和1兩種狀態(2^1);兩個二進制位能夠表示00、0一、十、11四種(2^2)狀態;三位二進制數可表示八種狀態(2^3)……python
字節,是計算機中數據處理的基本單位,計算機中以字節爲單位存儲和解釋信息,規定一個字節由八個二進制位構成,即1個字節等於8個比特(1Byte=8bit)。八位二進制數最小爲00000000,最大爲11111111;一般1個字節能夠存入一個ASCII碼,2個字節能夠存放一個漢字國標碼。python2.7
在計算機中,一串數碼做爲一個總體來處理或運算的,稱爲一個計算機字,簡稱宇。字一般分爲若干個字節(每一個字節通常是8位)。在存儲器中,一般每一個單元存儲一個字,所以每一個字都是能夠尋址的。字的長度用位數來表示。在計算機的運算器、控制器中,一般都是以字爲單位進行傳送的。函數
字長:電腦技術中對CPU在單位時間內(同一時間)能一次處理的二進制數的位數叫字長。因此能處理字長爲8位數據的CPU一般就叫8位的CPU。同理32位的CPU就能在單位時間內處理字長爲32位的二進制數據。post
字節和字長的區別:因爲經常使用的英文字符用8位二進制就能夠表示,因此一般就將8位稱爲一個字節。字長的長度是不固定的,對於不一樣的CPU、字長的長度也不同。8位的CPU一次只能處理一個字節,而32位的CPU一次就能處理4個字節,同理字長爲64位的CPU一次能夠處理8個字節。編碼
ASCII
: 1個字節,只編碼英文字母和符號.net
gb2312
: 2個字節,增長了中文漢字和符號code
Unicode
: 把全部語言都統一到一套編碼裏把全部語言都統一到一套編碼裏,
通常是2個字節,生僻字4個字節htm
utf-8
: 可變長編碼,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:blog
在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼,這樣能夠節省不少存儲空間。
注:這裏討論的是python2.7的狀況
在python中,str和unicode都是basestring的子類,basestring有如下兩個方法:
encode()
: 將unicode字符串轉換爲其餘編碼字符串,參數爲轉換後編碼
decode()
: 將其餘編碼轉換爲unicode字符串,參數爲轉換前編碼
PS:"string".decode('utf-8') == unicode('string', 'utf-8')
s = '中文' print type(s), len(s) u = u'中文' print type(u), len(u) u2s = u'中文'.encode('utf-8') print type(u2s), len(u2s)
結果是這樣的
<type 'str'> 6 <type 'unicode'> 2 <type 'str'> 6
console下查看u2s
>>> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87'
結論:
python中定義的一個str變量實則是字節串,由Unicode通過編碼(encode)後的字節組成的(
也正好印證了utf8編碼中一箇中文字符是3個字節)
Unicode纔是真正意義上的字符串,由字符組成
再次回顧兩個函數用法
s = '中文' # 這時是str,轉爲unicode須要用decode u = s.decode('utf-8') print type(u) # 打印 <type 'unicode'> # unicode轉爲str ,使用encode s2 = u.encode('utf-8') print type(s2) # 打印 <type 'str'>
新結論:不一樣編碼轉換,使用Unicode做爲中間編碼
#s是code_A的str s.decode('code_A').encode('code_B')
在Python 3.x版本中,把'xxx'
和u'xxx'
已經都統一成Unicode編碼了,即寫不寫前綴u都是同樣的,而以字節形式表示的字符串則必須加上b前綴:b'xxx'
。
因爲Python源代碼也是一個文本文件,因此,當你的源代碼中包含中文的時候,在保存源代碼時,就須要務必指定保存爲UTF-8編碼。當Python解釋器讀取源代碼時,爲了讓它按UTF-8編碼讀取,咱們一般在文件開頭寫上這兩行:
#!/usr/bin/env python # -*- coding: utf-8 -*-