關於python2中的unicode和str以及python3中的str和bytes

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'>

#爲啥結果不同
相關文章
相關標籤/搜索