大家好,很久沒更新了,也是年底了最近比較忙,同時也在研究python的其他內容,畢竟是python小白,自學道路艱難。
好了今天和大家一起探討下python3編碼過程中對的一些轉碼事宜。
python3中對文本和二進制做了比較清晰的區分。python3默認編碼為unicode,由str類型進行表示。二進制數據使用byte類型表示,所以不會將str和byte混在一起。在實際應用中我們經常需要將兩者進行互轉
有幾點需要注意:
1:字符串通過編碼轉換為字節碼,字節碼通過解碼轉換為字符串
str--->(encode)--->bytes,bytes--->(decode)--->str
1
2
3
4
5
6
|
import sys print ( '目前系統的編碼為:' ,sys.getdefaultencoding()) name = '小明' print ( type (name)) #首先我們來打印下轉碼前的name類型,因為它是str,所以可以通過encode來進行編碼 name1 = name.encode( 'utf-8' ) print (name1) |
輸出為:
目前系統的編碼為: utf-8
<class 'str'>
b'\xe5\xb0\x8f\xe6\x98\x8e'
這里大家或許會有一個疑問,編碼utf-8為什么不是decode轉成unicode
因為開頭跟大家講過,python3默認就是unicode,utf-8可以看成是unicode的一個擴展集,所以其實name本身是一個unicode編碼的,所以可以通過encode編碼成utf-8,這里可以試下,如果認為name應該是utf-8,那我們來試下encode會不會報錯
1
2
3
4
|
name1 = name.decode( 'utf-8' ) print (name1) 這里會報如下錯誤: AttributeError: 'str' object has no attribute 'decode' |
所以,對于python3默認的就是unicode編碼。
既然已經encode成utf-8了,那我們來看下decode會出現什么樣的結果
1
2
3
4
5
6
7
|
name2 = name1.decode( 'utf-8' ) print ( type (name2)) print (name2) 這里要跟大家說下,decode()括號中為什么寫utf - 8 ,而不寫gbk,可以這樣理解,因為要解碼,你總得告訴它我是什么編碼的吧,比如我原先是utf - 8 格式的編碼,現在要解碼,但是如果冒充utf - 8 ,說自己是gbk,那就會出現亂碼,見下: < class 'str' > < class 'str' > 灝忔槑 |
另外如果大家encode()和decode()括號中不寫編碼格式,系統會默認為utf-8,大家可以試下。
2:utf-8編碼格式和gbk編碼格式互轉
既然知道utf-8編碼與解碼的規律,那我們來試試它與gbk之間的火花。
1
2
3
4
5
6
7
8
9
10
11
12
|
name1 = name.encode( 'utf-8' ) name2 = name1.decode( 'utf-8' ) name3 = name2.encode( 'gbk' ) name4 = name3.decode( 'gbk' ) print ( type (name3)) print (name3) 下面是name3的結果 < class 'bytes' > b '\xd0\xa1\xc3\xf7' 下面是name4的結果 < class 'str' > 小明 |
從上面可以卡出name2本來是解碼成utf-8的,后來有隊name2進行了gbk編碼,接著又再次對name3進行gbk解碼
所以不難看出,其實utf-8和gbk之間都是通過unicode來做一個中間轉換的操作
在例子中
1
2
|
name2 = name1.decode( 'utf-8' ) name3 = name2.encode( 'gbk' ) |
這兩步的操作就是通過unicode來轉的
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/qq_29053519/article/details/79170519