大家好,很久沒更新了,也是年底了最近比較忙,同時(shí)也在研究python的其他內(nèi)容,畢竟是python小白,自學(xué)道路艱難。
好了今天和大家一起探討下python3編碼過程中對(duì)的一些轉(zhuǎn)碼事宜。
python3中對(duì)文本和二進(jìn)制做了比較清晰的區(qū)分。python3默認(rèn)編碼為unicode,由str類型進(jìn)行表示。二進(jìn)制數(shù)據(jù)使用byte類型表示,所以不會(huì)將str和byte混在一起。在實(shí)際應(yīng)用中我們經(jīng)常需要將兩者進(jìn)行互轉(zhuǎn)
有幾點(diǎn)需要注意:
1:字符串通過編碼轉(zhuǎn)換為字節(jié)碼,字節(jié)碼通過解碼轉(zhuǎn)換為字符串
str--->(encode)--->bytes,bytes--->(decode)--->str
- import sys
- print('目前系統(tǒng)的編碼為:',sys.getdefaultencoding())
- name='小明'
- print(type(name))#首先我們來打印下轉(zhuǎn)碼前的name類型,因?yàn)樗莝tr,所以可以通過encode來進(jìn)行編碼
- name1=name.encode('utf-8')
- print(name1)
輸出為:
- 目前系統(tǒng)的編碼為: utf-8
- <class 'str'>
- b'\xe5\xb0\x8f\xe6\x98\x8e'
這里大家或許會(huì)有一個(gè)疑問,編碼utf-8為什么不是decode轉(zhuǎn)成unicode
因?yàn)殚_頭跟大家講過,python3默認(rèn)就是unicode,utf-8可以看成是unicode的一個(gè)擴(kuò)展集,所以其實(shí)name本身是一個(gè)unicode編碼的,所以可以通過encode編碼成utf-8,這里可以試下,如果認(rèn)為name應(yīng)該是utf-8,那我們來試下encode會(huì)不會(huì)報(bào)錯(cuò)
- name1=name.decode('utf-8')
- print(name1)
- 這里會(huì)報(bào)如下錯(cuò)誤:
- AttributeError: 'str' object has no attribute 'decode'
所以,對(duì)于python3默認(rèn)的就是unicode編碼。
既然已經(jīng)encode成utf-8了,那我們來看下decode會(huì)出現(xiàn)什么樣的結(jié)果
- name2=name1.decode('utf-8')
- print(type(name2))
- print(name2)
- 這里要跟大家說下,decode()括號(hào)中為什么寫utf-8,而不寫gbk,可以這樣理解,因?yàn)橐獯a,你總得告訴它我是什么編碼的吧,比如我原先是utf-8格式的編碼,現(xiàn)在要解碼,但是如果冒充utf-8,說自己是gbk,那就會(huì)出現(xiàn)亂碼,見下:
- <class 'str'>
- <class 'str'>
- 灝忔槑
另外如果大家encode()和decode()括號(hào)中不寫編碼格式,系統(tǒng)會(huì)默認(rèn)為utf-8,大家可以試下。
2:utf-8編碼格式和gbk編碼格式互轉(zhuǎn)
既然知道utf-8編碼與解碼的規(guī)律,那我們來試試它與gbk之間的火花。
- name1=name.encode('utf-8')
- name2=name1.decode('utf-8')
- name3=name2.encode('gbk')
- name4=name3.decode('gbk')
- print(type(name3))
- print(name3)
- 下面是name3的結(jié)果
- <class 'bytes'>
- b'\xd0\xa1\xc3\xf7'
- 下面是name4的結(jié)果
- <class 'str'>
- 小明
從上面可以卡出name2本來是解碼成utf-8的,后來有隊(duì)name2進(jìn)行了gbk編碼,接著又再次對(duì)name3進(jìn)行g(shù)bk解碼
所以不難看出,其實(shí)utf-8和gbk之間都是通過unicode來做一個(gè)中間轉(zhuǎn)換的操作
- 在例子中
- name2=name1.decode('utf-8')
- name3=name2.encode('gbk')
- 這兩步的操作就是通過unicode來轉(zhuǎn)的
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。