python2.7.x 以Unicode表示的str用u'...'表示---(沒(méi)有u,中文是亂碼)
python3.x.x 默認(rèn)以Unicode表示str (可以加u)
Unicode表示的str轉(zhuǎn)化成utf-8格式
python2.7.x u'ABC'.encode('utf-8')
python3.x.x 'ABC'.encode('utf-8')
英文字符轉(zhuǎn)換后表示的UTF-8的值和Unicode值相等(但占用的存儲(chǔ)空間不同)
而中文字符轉(zhuǎn)換后1個(gè)Unicode字符將變?yōu)?個(gè)UTF-8字符
把UTF-8編碼表示的字符串'xxx'轉(zhuǎn)換為Unicode字符串 'xxx'.decode('utf-8')
腳本中
#!/usr/bin/env python
# -*- coding: utf-8 -*-
并且中文字符串必須是Unicode格式
字符與字節(jié)的轉(zhuǎn)換
1.由于Python的字符串類(lèi)型是str橄登,在內(nèi)存中以Unicode表示,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié)奖年。
2.如果要在網(wǎng)絡(luò)上傳輸羹蚣,或者保存到磁盤(pán)上摄职,就需要把str變?yōu)橐宰止?jié)為單位的bytes几颜。
3.Python對(duì)bytes類(lèi)型的數(shù)據(jù)用帶b前綴的單引號(hào)或雙引號(hào)表示
例子: x=b'ABC'
要注意區(qū)分'ABC'和b'ABC'脸候,前者是str穷娱,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)运沦。
以Unicode表示的str通過(guò)encode()方法可以編碼為指定的bytes泵额,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的携添,含有中文的str可以用UTF-8編碼為bytes嫁盲。
含有中文的str無(wú)法用ASCII編碼,因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍薪寓,Python會(huì)報(bào)錯(cuò)亡资。
在bytes中,無(wú)法顯示為ASCII字符的字節(jié)向叉,用\x##顯示锥腻。
反過(guò)來(lái),如果我們從網(wǎng)絡(luò)或磁盤(pán)上讀取了字節(jié)流母谎,那么讀到的數(shù)據(jù)就是bytes瘦黑。
要把bytes變?yōu)閟tr,就需要用decode()方法:
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
len()函數(shù)計(jì)算的是str的字符數(shù)奇唤,如果換成bytes幸斥,len()函數(shù)就計(jì)算字節(jié)數(shù):
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))---------------python3
6
特別注意:
>>>len('中文')--------------------------python3
2
>>>len(u'中文')-------------------------python2
2
>>>len('中文')-------------------------python2
6
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者