1. 程式人生 > >python3字串編碼總結str(unicode)bytes

python3字串編碼總結str(unicode)bytes

1.字串的編碼形式

字串的編碼最一開始是ascii,使用8位二進位制表示,因為英文就是編碼的全部。後來其他國家的語言加入進來,ascii就不夠用了,所以一種萬國碼就出現了,它的名字就叫unicode,unicode編碼對所有語言使用兩個位元組,部分漢語使用三個位元組。但是這就導致一個問題,就是unicode不僅不相容ascii編碼,而且會造成空間的浪費,於是uft-8編碼應運而生了,utf-8編碼對英文使用一個位元組的編碼,由於這樣的特點,很快得到全面的使用。
1.1 ASCII

美國資訊交換標準碼。 在計算機的儲存單元中,一個ASCII碼值佔一個位元組(8個二進位制位),但其最高位(b7)用作奇偶校驗位。ASCII(American Standard Code for Information Interchange),是一種單位元組的編碼。計算機世界裡一開始只有英文,而單位元組可以表示256個不同的字元,可以表示所有的英文字元和許多的控制符號。不過ASCII只用到了其中的一半(\x80以下),這也是MBCS得以實現的基礎。
1.3 Unicode、UTF-8

Unicode是業界的一種標準,它可以使電腦得以呈現世界上數十種文字的系統。 後來,有人開始覺得太多編碼導致世界變得過於複雜了,讓人腦袋疼,於是大家坐在一起拍腦袋想出來一個方法:所有語言的字元都用同一種字符集來表示,這就是Unicode。
Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。
1.4 GB2312、GBK、GB18030

GB是中國荒謬的國家標準。GB2312、GBK、GB18030各為前一個的擴充套件。

2.位元組碼bytes

python3中bytes用b’xxx’表示,其中的x可以用字元,也可以用ascii表示。python3中的二進位制檔案(如文字檔案)統一採用位元組碼讀寫。

3.python2與python3字串編碼的區別
python預設編碼

default encodings in Python are:
Python 2.x: ASCII
Python 3.x: UTF-8

A. python3預設使用的是str型別對字串編碼,預設使用bytes操作二進位制資料流,兩者不能混淆!!
B. Python3有兩種表示字元序列的型別:bytes和str。前者的例項包含原始的8位值,後者的例項包含Unicode字元。
C. Python2也有兩種表示字元序列的型別,分別叫做str和Unicode,與Python3不同的是,str例項包含原始的8位值;而unicode的例項,則包含Unicode字元。

str(unicode)型別是基準!
要將str型別轉化為bytes型別,使用encode()內建函式;反過來,使用decode()函式。
示例如下:

>>> s = "木又盛,你好!"
>>> type(s)
<class 'str'>
>>> t = s.encode("gbk")
>>> t
b'\xc4\xbe\xd3\xd6\xca\xa2\xa3\xac\xc4\xe3\xba\xc3\xa3\xa1'
>>> type(t)
<class 'bytes'>
>>> t.decode("gbk")
'木又盛,你好!'

4.len()函式
要計算str包含多少個字元,可以用len()函式

>>> len('ABC')
3
>>> len('中文')
2

len()函式計算的是str的字元數,如果換成bytes,len()函式就計算位元組數

>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

最後,還有一個疑問:網頁的編碼??

>>>import urllib.request
>>>response = urllib.request.urlopen('http://www.baidu.com')
>>>html = response.read()
>>>type(html)
<class 'bytes'>

要正常顯示的話,就要使用decode()方法了。