Python3
最重要的一項(xiàng)改進(jìn)之一就是解決了
Python2
中字符串與字符編碼遺留下來(lái)的這個(gè)大坑。本文就和大家一起來(lái)扒一扒python3
是如何解決的字符編碼問(wèn)題,希望對(duì)大家
學(xué)習(xí)python3有所幫助。
Python2
字符串設(shè)計(jì)上的一些缺陷:
·
使用
ASCII
碼作為默認(rèn)編碼方式,對(duì)中文處理很不友好。
·
把字符串的牽強(qiáng)地分為
unicode
和
str
兩種類型,誤導(dǎo)開發(fā)者
當(dāng)然這并不算 Bug
,只要處理的時(shí)候多留心也可以避免這些坑。但在
Python3
兩個(gè)問(wèn)題都很好的解決了。
首先,Python3
把系統(tǒng)默認(rèn)編碼設(shè)置為
UTF-8
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>
然后,文本字符和二進(jìn)制數(shù)據(jù)區(qū)分得更清晰,分別用 str
和
bytes
表示。文本字符全部用
str
類型表示,
str
能表示
Unicode
字符集中所有字符,而二進(jìn)制字節(jié)數(shù)據(jù)用一種全新的數(shù)據(jù)類型,用
bytes
來(lái)表示。
str
>>> a = "a">>> a'a'>>> type(a)
<
class '
str'>
>>> b = "
禪
">>> b'
禪
'>>> type(b)
<
class '
str'>
bytes
Python3
中,在字符引號(hào)前加
‘b’
,明確表示這是一個(gè)
bytes
類型的對(duì)象,實(shí)際上它就是一組二進(jìn)制字節(jié)序列組成的數(shù)據(jù),
bytes
類型可以是
ASCII
范圍內(nèi)的字符和其它十六進(jìn)制形式的字符數(shù)據(jù),但不能用中文等非
ASCII
字符表示。
>>> c = b'a'>>> c
b'a'>>> type(c)
class '
bytes'>
>>> d = b'\xe7\xa6\x85'>>> d
b'\xe7\xa6\x85'>>> type(d)
class '
bytes'>>>>
>>> e = b'
禪
'
File "", line 1SyntaxError: bytes can only contain ASCII literal characters.
bytes
類型提供的操作和
str
一樣,支持分片、索引、基本數(shù)值運(yùn)算等操作。但是
str
與
bytes
類型的數(shù)據(jù)不能執(zhí)行
+
操作,盡管在py2
中是可行的。
>>> c = b'a'>>> c
b'a'>>> type(c)
<
class '
bytes'>
>>> d = b'\xe7\xa6\x85'>>> d
b'\xe7\xa6\x85'>>> type(d)
<
class '
bytes'>>>>
>>> e = b'
禪
'
File "", line 1SyntaxError: bytes can only contain ASCII literal characters.
python2
與
python3
字節(jié)與字符的對(duì)應(yīng)關(guān)系
encode 與 decode
str
與
bytes
之間的轉(zhuǎn)換可以用
encode
和從
decode
方法。
encode
負(fù)責(zé)字符到字節(jié)的編碼轉(zhuǎn)換。默認(rèn)使用
UTF-8
編碼準(zhǔn)換。
>>> s = "Python
之禪
"
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
b'Python\xd6\xae\xec\xf8'
decode
負(fù)責(zé)字節(jié)到字符的解碼轉(zhuǎn)換,通用使用
UTF-8
編碼格式進(jìn)行轉(zhuǎn)換。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python
之禪
'
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python
之禪
'
來(lái)源:
伯樂(lè)在線