Python2和Python3中的字符串編碼問題解決

Python2和Python3在字符串編碼上是有明顯的區別。python

在Python2中,字符串沒法徹底地支持國際字符集和Unicode編碼。爲了解決這種限制,Python2對Unicode數據使用了單獨的字符串類型。要輸入Unicode字符串字面量,要在第一個引號前加上'u'。Python2中普通字符串實際上就是已經編碼(非Unicode)的字節字符串。編碼

在Python3中,沒必要加入這個前綴字符,不然是語法錯誤,這是由於全部的字符串默認已是Unicode編碼了。spa

$ python2實例:code

>>> '張三'  #python2 會自動將字符串轉換爲合適編碼的字節字符串
'\xe5\xbc\xa0\xe4\xbf\x8a' #自動轉換爲utf-8編碼的字節字符串utf-8

>>> u'張三' #顯式指定字符串類型爲unicode類型, 此類型字符串沒有編碼,保存的是字符在unicode字符集中的代碼序號
u'\u5f20\u4fca'ci

>>> '張三'.encode('utf-8')  #python2 已經自動將其轉化爲utf-8類型編碼,所以再次編碼(python2會將該字符串看成用ascii或unicode編碼過)會出現錯誤。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)unicode

>>> '張三'.decode('utf-8')  #python2 能夠正常解碼,返回的字符串類是無編碼的unicode類型
u'\u5f20\u4fca'字符串

>>> b'張三'   # ‘張三' 已被python2轉換爲utf-8編碼,所以已爲字節字符串
'\xe5\xbc\xa0\xe4\xbf\x8a'it

>>> print '張三'
張三io

>>> print u'張三'
張三

>>> print b'張三'
張三

$ python3實例:

>>> '張三' #python3的字符串默認爲unicode格式(無編碼)
'張三'

>>> u'張三' #因爲默認爲unicode格式,所以字符串不用像python2同樣顯式地指出其類型,不然是語法錯誤。
File "<stdin>", line 1
u'張三'
^
SyntaxError: invalid syntax

>>> type('張三') #python3中文本字符串和字節字符串是嚴格區分的,默認爲unicode格式的文本字符串
<class 'str'>

>>> '張三'.decode('utf-8') #由於默認的文本字符串爲unicode格式,所以文本字符串沒有decode方法
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

>>> '張三'.encode('utf-8') #將文本字符串編碼,轉換爲已編碼的字節字符串類型
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>> type('張三'.encode('utf-8'))
<class 'bytes'>

>>> print ('張三'.encode('utf-8')) #對於已編碼的字節字符串,文本字符串的許多特性和方法已經不能使用。
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>>print ('張三'.encode('utf-8'))
b'\xe5\xbc\xa0\xe4\xbf\x8a'

>>> print ('張三'.encode('utf-8').decode('utf-8'))  #必須將字節字符串解碼後才能打印出來張三

相關文章
相關標籤/搜索