關于python編碼,你真的明白了嗎

計算機存儲的幾個概念

想要徹底搞清楚編碼問題,我們必須要先搞清楚計算機是怎么存儲數據的,這就涉及到了計算機基礎的幾個概念了,開篇我們就先來捋捋這幾個容易混淆的概念。

bit

二進制位, 是計算機內部數據儲存的最小單位,11010100是一個8位二進制數。一個二進制位只可以表示0和1兩種狀態(21);兩個二進制位可以表示00、01、10、11四種(22)狀態;三位二進制數可表示八種狀態(2^3)……

Byte

字節,是計算機中數據處理的基本單位,計算機中以字節為單位存儲和解釋信息,規定一個字節由八個二進制位構成,即1個字節等于8個比特(1Byte=8bit)。八位二進制數最小為00000000,最大為11111111;通常1個字節可以存入一個ASCII碼,2個字節可以存放一個漢字國標碼。

在計算機中,一串數碼作為一個整體來處理或運算的,稱為一個計算機字,簡稱宇。字通常分為若干個字節(每個字節一般是8位)。在存儲器中,通常每個單元存儲一個字,因此每個字都是可以尋址的。字的長度用位數來表示。在計算機的運算器、控制器中,通常都是以字為單位進行傳送的。

字長

字長:電腦技術中對CPU在單位時間內(同一時間)能一次處理的二進制數的位數叫字長。所以能處理字長為8位數據的CPU通常就叫8位的CPU。同理32位的CPU就能在單位時間內處理字長為32位的二進制數據。

字節和字長的區別:由于常用的英文字符用8位二進制就可以表示,所以通常就將8位稱為一個字節。字長的長度是不固定的,對于不同的CPU、字長的長度也不一樣。8位的CPU一次只能處理一個字節,而32位的CPU一次就能處理4個字節,同理字長為64位的CPU一次可以處理8個字節。

常見的編碼

ASCII: 1個字節,只編碼英文字母和符號

gb2312: 2個字節,增加了中文漢字和符號

Unicode: 把所有語言都統一到一套編碼里把所有語言都統一到一套編碼里,
一般是2個字節,生僻字4個字節

utf-8: 可變長編碼,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:

在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼,這樣可以節省很多存儲空間。

Python編碼

注:這里討論的是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 -*-

參考

字節、字、位、比特,這四者之間的關系
廖雪峰:python2.7教程之字符串和編碼
PYTHON-進階-編碼處理小結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容