Python 2和Python 3的編碼問題

2022-06-11 06:51:07 字數 3043 閱讀 9674

在python2中,字串無法完全地支援國際字符集和unicode編碼。為了解決這種限制,python2對unicode資料使用了單獨的字串型別。要輸入unicode字串字面量,要在第乙個引號前加上'u'。python2中普通字串實際上就是已經編碼(非unicode)的位元組字串。

在python3中,不必加入這個字首字元,否則是語法錯誤,這是因為所有的字串預設已經是unicode編碼了。

#python2**>>> '張三'  #python2 會自動將字串轉換為合適編碼的位元組字串

'\xe5\xbc\xa0\xe4\xbf\x8a' #自動轉換為utf-8編碼的位元組字串

>>> u'張三' #顯式指定字串型別為unicode型別, 此型別字串沒有編碼,儲存的是字元在unicode字符集中的**序號

u'\u5f20\u4fca'

>>> '張三'.encode('utf-8') #python2 已經自動將其轉化為utf-8型別編碼,因此再次編碼(python2會將該字串當作用ascii或unicode編碼過)會出現錯誤。

traceback (most recent call last):

file "", line 1, in unicodedecodeerror: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

>>> '張三'.decode('utf-8') #python2 可以正常解碼,返回的字串類是無編碼的unicode型別

u'\u5f20\u4fca'

>>> b'張三' # 『張三' 已被python2轉換為utf-8編碼,因此已為位元組字串

'\xe5\xbc\xa0\xe4\xbf\x8a'

>>> print '張三'

> print u'張三'

> print b'張三'

張三

#python3**>>> '張三' #python3的字串預設為unicode格式(無編碼)

'張三'

>>> u'張三' #由於預設為unicode格式,因此字串不用像python2一樣顯式地指出其型別,否則是語法錯誤。

file "", line 1

u'張三'

^syntaxerror: invalid syntax

>>> type('張三') #python3中文字字串和位元組字串是嚴格區分的,預設為unicode格式的文字字串

>>> '張三'.decode('utf-8') #因為預設的文字字串為unicode格式,因此文字字串沒有decode方法

traceback (most recent call last):

file "", line 1, in attributeerror: 'str' object has no attribute 'decode'

>>> '張三'.encode('utf-8') #將文字字串編碼,轉換為已編碼的位元組字串型別

b'\xe5\xbc\xa0\xe4\xbf\x8a'

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

>>> 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')) #必須將位元組字串解碼後才能列印出來

張三

總結:python3 一切都很美好在python3當中,文字字串型別(使用unicode資料儲存)被命名為 str , 位元組字串型別被命名為 bytes 。一般情況下,例項化乙個字串會得到乙個 str 物件 :

所以現在很多人都說,python3預設是unicode,也就是這個意思。

如果你想得到bytes,那就在文字之前加上字首 b , 或者 encode 一下。

所以,很顯然,str 物件有乙個encode方法,bytes 物件有乙個decode方法。

python2 相當的操蛋,甚至會誤導你

在python3中的 str 物件在python2中叫做 unicode ,感覺很通俗對吧?但 bytes 物件在python2中叫做 str,對。。就是你平時用的 str , 預設的那個。。。

如果你想得到乙個文字字串,你需要在字串之前加上字首 u 或者 decode 一下。

搞笑的還不止這麼點,python2中的 str (位元組) 物件,竟然有乙個 encode 方法!!!而且你別指望它有什麼特殊用處,它就是用來報錯的,永遠都別使用它!!!

同樣的,unicode (文字字元) 物件也有乙個用來報錯的 decode 方法。

我們嘗試一下:

不知道大家注意到錯誤資訊沒有,我們在進行解碼,規則是gbk,但它說無法用 ascii 進行編碼,這是為什麼?

這就是python2自作聰明為了對乙個unicode物件執行解碼而進行的隱式編碼,等於以下**:

b.encode('ascii').decode('gbk')

這就是為什麼很多人說,python2的編碼很操蛋。

python3和python2的區別

1.效能 py3.0執行 pystone benchmark的速度比py2.5慢30 guido認為py3.0有極大的優化空間,在字串和整形操作上可 以取得很好的優化結果。py3.1效能比py2.5慢15 還有很大的提公升空間。2.編碼 py3.x原始碼檔案預設使用utf 8編碼,這就使得以下 是合...

Python2和Python3的比較

python2 python3 print fish print fish unicode 是單獨的 unicode utf 8 字串 b b china byte 和 bytearrays type b type bytes s b.decode 轉化成 string 型別b1 s encode ...

python3和python2的區別

這個星期開始學習python了,因為看的書都是基於python2.x,而且我安裝的是python3.1,所以書上寫的地方好多都不適用於python3.1,特意在google上search了一下3.x和2.x的區別。特此在自己的空間中記錄一下,以備以後查詢方便,也可以分享給想學習python的frie...