Python中的字符串
在Python中,字符串的類型可以歸為三類:str,bytes,bytearray,其中str和bytes是不可變類型,而bytearray是可變類型。由於Python 2.X和Python 3.X的區別,相應的,它們在Python 2.X和Python 3.X中有不同的意義。
在Python 2.X中,str即可以表示8bit的文本(例如ASCII文本,Latin-1文本),也可以表示二進制數據,也就是說,在Python 2.X中,str和bytes類型是等價的;如果要表示Unicode文本,需要單獨使用unicode字符串;而bytearray只有在Python 2.6中才有,表示可以修改的bytes數據;
在Python 3.X, str表示Unicode文本,bytes表示二進制數據,二者不等價;bytearray和Python 2.X中的意義一樣,也表示可以修改的bytes數據。
所有的的字符串問題,包括讀寫文件,都可以歸納為上述問題。
str、bytes和bytearray相互轉換
1 Python 2.X
# str與bytes等價 >>>B = b‘spam‘ # bytes字面量 >>>S = ‘eggs‘ # str字面量 >>>type(B), type(S) (<type ‘str‘>, <type ‘str‘>) # str與unicode的轉換,也即bytes與unicode的轉換 >>>str(u‘spam‘) #unicode轉換為str spam >>>unicode(‘spam‘) #str轉換為unicode,unicode函數可以選擇編碼,默認是平臺編碼 u‘spam‘ # str與bytearray的轉換,也即bytes與bytearray的轉換 >>>S = ‘spam‘ >>>C = bytearray(S) >>>C bytearray(b‘spam‘)
2 Python 3.X
# str與bytes的轉換,有兩種方法: # 1 使用str類型的encode方法 # 2 使用bytes函數 >>>S = ‘eggs‘ >>>S.encode() b‘eggs‘ >>>bytes(S, encoding=‘ascii‘) b‘eggs‘ # bytes與str的轉換,有兩種方法: # 1 使用bytes類型的decode方法 # 2 使用str函數 >>>B = b‘spam‘ >>>B.decode() ‘spam‘ >>>str(B, encode=‘asci‘) ‘spam‘ # str與bytearray的轉換 >>>S = ‘spam‘ >>>C = bytearray(S, ‘latin1‘) # 必須指明編碼 >>>C bytearray(b‘spam‘) # bytes與bytearray的轉換 >>>B = b‘spam‘ >>>C = bytearray(B) >>>C bytearray(b‘spam‘)
對於上面的由bytes轉換為str的例子,如果調用str函數不傳遞編碼參數‘ascii‘,那麽str函數並不是使用平臺的默認編碼,而是返回bytes對象的一個print string,看例子就明白了:
>>>B = b‘spam‘ >>>str(B) "b‘spam‘"
字面量的表示方法
1 Pyhon 2.X
在Python 2.X中,聲明字面量可以使用前綴b/B,u/U。其中對於Python 2.X來說,不使用前綴和使用前綴b/B的效果是一樣的,都表示str(或者bytes)類型,如果要表示unicode字符串,則必須帶前綴u/U。
2 Python 3.X
在Python 3.X中,聲明字面量可以使用b/B,u/U前綴。其中,對於Python 3.X來說,不使用前綴和使用前綴u/U的效果是一樣的,都表示str類型(也即unicode字符串),如果要表示bytes類型,那麽必須加前綴b/B。但是需要註意一點的就是,u/U前綴在Python 3.0中不支持。
字面量中嵌入字符編碼
Python支持在字符串字面量中直接嵌入字符編碼,字符編碼的形式可以為\xNN,也可以是\uNNNN,也可以是\UNNNNNNNN。
1 Python 2.X
由於str類型(也即是bytes類型)在Python 2.X中是8bit的,因此只能使用\XNN的形式;對於unicode字符串,可以使用上面三種形式:
>>>S = ‘\x31‘ # 字符‘1‘的編碼為\x31 >>>S ‘1‘ >>>S = ‘\u0031‘ # \u形式不支持 >>>S ‘\\u0031‘ >>>S = ‘\U00000031‘ # \U形式不支持 >>>S ‘\\U00000031‘ >>>S = u‘\x31‘ >>>S u‘1‘ >>>S = u‘\u0031‘ >>>S u‘1‘ >>>S = ‘\U00000031‘ >>>S u‘1‘
2 Python 3.X
由於Python 3.X中str類型就是unicod的,所以支持上述三種形式,相反,Python 3.X中的bytes類型只支持\xNN:
>>>S = ‘\x31‘ >>>S ‘1‘ >>>S = ‘\u0031‘ >>>S ‘1‘ >>>S = ‘\U00000031‘ >>>S ‘1‘ >>>S = b‘\x31‘ >>>S b‘1‘ >>>S = b‘\u0031‘ #不識別 >>>S b‘\\u0031‘ >>>S = b‘\U00000031‘ #不識別 >>>S b‘\\U00000031‘
為了進一步的理解,我們可以使用len函數來看長度。對於Python 2.X和Python 3.X,凡是打印出字符‘1‘的,使用len計算長度都是1,凡是不識別的,對於\u形式,len計算的長度是6,對於\U形式,len計算的長度是10。
類型混用
1 Python 2.X
在Python 2.X中,如果unicode字符串與bytes類型(也即str類型)混用,如果bytes類型中只包含ASCII字符,那麽,Python自動將bytes類型轉換成unicode字符串:
>>>u‘ab‘ + ‘cd‘ u‘abcd‘ >>>u‘ab‘ + ‘cd\xef‘ # 含有非ASCII字符,不支持 UnicdoeDecodeError:‘ascii‘ codec can‘t decode byte 0xef in position 2:orinal not in range(120)
2 Python 3.X
unicode字符串與bytes類型混用,Python不會自動轉換,必須手動轉換成統一類型,要麽統一成unicode字符串,要麽統一成bytes類型。
Python中的字符串