Python的誕生時間比Unicode要早很多,所以早期Python版本的默認編碼是ASCII,現在python2依然默認是ASCII編碼,而python3默認是utf-8。
因爲Python的誕生比Unicode標準發佈的時間還要早,所以最早的Python只支持ASCII編碼,普通的字符串’ABC’在Python內部都是ASCII編碼的。Python提供了ord()和chr()函數,可以把字母和對應的數字相互轉換:
>>>ord('A')
65
>>>chr(65)
A
Python在後來添加了對Unicode的支持,以Unicode表示的
字符串用 u’…’表示,python默認是unicode表示的字符串,所以通常不寫u。
python3中str字符串類型在內存中存的是Unicode數據,bytes類型字符串存儲的是bytes數據。如下:
name0 = 'abc'
name1 = b'abc'
name2 = '二剛'
name3 =u'二剛'
print(type(name0))
print(type(name1))
print(type(name2))
print(type(name3))
print(repr(name0))
print(repr(name1))
print(repr(name2))
print(repr(name3))
運行結果:
<class 'str'>
<class 'bytes'>
<class 'str'>
<class 'str'>
'abc'
b'abc'
'二剛'
'二剛'
u’中’和u’\u4e2d’是一樣的,\u後面是十六進制的Unicode
碼。又如,u’A’和u’\u0041’也是一樣的。
把u’xxx’轉換爲UTF-8編碼的’xxx’用encode(‘utf-8’)方法,即編碼例如:
>>>u'ABC'.encode('utf-8')
b'ABC'
>>>u'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>>len(u'ABC')
3
>>>len(b'ABC')
3
>>>len(u'中文')
2
>>>len('\xe4\xb8\xad\xe6\x96\x87')
6
英文字符轉換後表示的UTF-8的值和Unicode值相等(但佔用的存儲空間不同),而中文字符轉換後1個Unicode字符將變爲3個UTF-8字符,你看到的\xe4就是其中一個字節,因爲它的值是 228,沒有對應的字母可以顯示,所以以十六 進制顯示字節的數值。len()函數可以返回字符串的長度.
**反過來,把UTF-8編碼表示的字符串’xxx’轉換爲Unicode字符串
u’xxx’用decode(‘utf-8’)方法,即解碼**例如:
>>>b'abc'.decode('utf-8')
'abc'
>>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'或 u'\u4e2d\u6587'
由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存爲UTF-8編碼。當Python解釋器讀取源代碼時,爲了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python# -*- coding: utf-8 -*-
第一行註釋是爲了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;
第二行註釋是爲了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
簡單的總結一下編碼bytes數據是爲了方便傳輸與存儲,而Unicode數據方便了顯示