python3有兩種表示字符序列的類型:bytes和str。前者的實例包含原始的8位值;後者的實例包含Unicode字符。python
python2中也有兩種表示字符序列的類型,分別叫作str和unicode。與python3不一樣的是,str的實例包含原始的8位值,而unicode的實例,則包含Unicode字符。數組
上面兩句話我特別不懂,因此文章後面就下是但願爲了把上面兩句話弄懂。編碼
看幾個例子:spa
#在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數組的類型卻用來作字符串,你說亂不亂,之因此這樣作是爲了與以前的程序保持兼容。3d
在Python2中,做爲兩種類型的字符序列,str與unicode須要轉換,它們是這樣轉換的.code
str——decode方法——》unicode——encode方法——》strblog
在python3中能夠這樣對應這轉換,配合上面的圖,也許會好理解一點。utf-8
byte——decode(解碼)方法——》str——>encode(編碼)方法——》byteci
#在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
還有就是隱式的轉換,當一個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'> #爲啥結果不同