主要的編碼有三種:ASCII趴生、Unicode、utf-8
ASCII僅包含大小寫的英文字母和部分標(biāo)點符號
Unicode包含當(dāng)前主要的語言和符號,且一直在不斷發(fā)展恨旱。Unicode通常以2字節(jié)表示一個字符媒吗,生僻字以4個字節(jié)表示一個字符仑氛。
utf-8以1個字節(jié)表示1個英文字母,3個字節(jié)表示1個中文字符闸英。
我們就可以總結(jié)一下現(xiàn)在計算機系統(tǒng)通用的字符編碼工作方式:
在計算機內(nèi)存中锯岖,統(tǒng)一使用Unicode編碼,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r候甫何,就轉(zhuǎn)換為UTF-8編碼出吹。
用記事本編輯的時候,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里辙喂,編輯完成后趋箩,保存的時候再把Unicode轉(zhuǎn)換為UTF-8保存到文件。
瀏覽網(wǎng)頁的時候加派,服務(wù)器會把動態(tài)生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器叫确。
所以你看到很多網(wǎng)頁的源碼上會有類似<meta charset="UTF-8" />的信息,表示該網(wǎng)頁正是用的UTF-8編碼芍锦。
對于單個字符的編碼竹勉,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉(zhuǎn)換為對應(yīng)的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
由于Python的字符串類型是str娄琉,在內(nèi)存中以Unicode表示次乓,一個字符對應(yīng)若干個字節(jié)吓歇。如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤上票腰,就需要把str變?yōu)橐宰止?jié)為單位的bytes城看。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str可以用ASCII編碼為bytes杏慰,內(nèi)容是一樣的测柠,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼缘滥,因為中文編碼的范圍超過了ASCII編碼的范圍轰胁,Python會報錯。