python3有兩種表示字符序列的類型:bytes和str。前者的實例包含原始的8位值;后者的實例包含Unicode字符。
python2中也有兩種表示字符序列的類型,分別叫做str和unicode。與python3不同的是,str的實例包含原始的8位值,而unicode的實例,則包含Unicode字符。
上面兩句話我特別不懂,所以文章后面就下是希望為了把上面兩句話弄懂。
看幾個例子:
#在python2中 >>> type('x'.decode('utf-8')) <type 'unicode'> #為啥不是二進制了,字符串還能解碼?再怎么解 #在python3中 >>> type('x'.decode('utf-8')) #這才是正常的嗎! Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'decode' #字符串怎么解,本來就沒有嗎
首先這個就是Python語言本身的問題,因為在Python2的語法中,默認的str並不是真正意義上我們理解的字符串,而是一個byte數組,或者可以理解成一個純ascii碼字符組成的字符串,與python3中的bytes類型的變量對應,而真正意義上通用的字符串則是unicode類型的變量,它與Python3中的str變量對應本來應該用作byte數組的類型卻用來做字符串,你說亂不亂,之所以這樣做是為了與之前的程序保持兼容。

在Python2中,作為兩種類型的字符序列,str與unicode需要轉換,它們是這樣轉換的.
str——decode方法——》unicode——encode方法——》str
在python3中可以這樣對應這轉換,配合上面的圖,也許會好理解一點。
byte——decode(解碼)方法——》str——>encode(編碼)方法——》byte
#在python2中 >>> type('x') <type 'str'> >>> type('x'.decode('utf-8')) <type 'unicode'> >>> type(u'x'.encode('utf-8')) <type 'str'> #在python3中 >>> type(x) <class 'str'> >>> type(b'x') <class 'bytes'>>>> type(b'x'.decode('utf-8')) <class 'str'>
>>> type('x'.encode('utf-8'))
<class 'bytes'>
還有就是隱式的轉換,當一個unicode字符串和一個str字符串進行連接的時候,會自動將str字符串轉換成unicode類型然后再連接,而這個時候使用的編碼方式則是系統所默認的編碼方式。python2默認的是ASCII,python3默認的是utf-8。
#在python2中 >>> x = u'喵' >>> x u'\u55b5' >>> type(x) <type 'unicode'> #在python3中 >>> x = u'喵' >>> x '喵' >>> type(x) <class 'str'> #為啥結果不一樣
