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


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

#為啥結果不一樣

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM