Python 編碼encode()、 解碼decode()問題


亂碼這種東西,時不時出現。本來開開心心想着我要學習啦,然后興高采烈打開了比火星文還火星文的字符……

沒事,我可以搞定這堆鬼畫符。

先來講一下為什么有亂碼這種東西的存在

故事是這樣滴:

字符串是Python的一種數據類型,它的處理會涉及到編碼問題。

我們可愛的計算機只能識別計算機語言,它以二進制字節形式來存儲數據,就是0和1構成的一個長長的二進制字節(一般人是識別不了這種這么原始的語言的)

而作為人類,我們說的是人話,'language'、'中文'、'123'……,用的是文本字符(計算機讀不懂這種抽象語言)

So, 人類創造出了ASCII碼,一種字符對照表(類似翻譯官),讓人類跟計算機能交流啦!

最早的對照表是ASCII碼表,ASCII碼表是美國人創造出來的,總共128個字符,滿足美國人民的日常需求!

但是!!!

世界那么大,每個國家都有自己的文字、符號,人類一直在擴充這張對照表,陸續創造了:擴展ASCII碼、GB2312、GBK……

啊哈哈,各個國家有各個國家的特色。於是,生產出了許許多多的對照表。

工作中經常會遇到不同編碼的問題,需要我們對不同的編碼進行轉換……但是隨着人們的擴充,選到合適的對照表越來越費時間、精力,你們誰才是我要的那張表?

你可知道,時間是寶貴的,更何況是程序員的時間。

終於,美國一個叫ISO的組織看不下去了,它決定整頓一下這個混亂的編碼世界

於是,Unicode就誕生啦,它將全世界人民的符號全部編進去了。讓你們全部有個規范走,別再搞事情啦!(快去這個神器的網站看看:https://unicode-table.com/en/)

在Python里,如果你們要轉換編碼,都要經過Unicode。

不論是UTF-8或者是GBK,整個過程都是先通過編碼decode轉換為Unicode告訴Unicode當前的編碼格式是什么、然后再通過解碼encode轉換為自己想要實現的編碼格式或類型。

假設一個只會中文和一個只會英文的外交官在交流,Unicode就扮演其中的翻譯官,他將中文字符轉換成Unicode字節,再將Unicode字節轉換成英文字符。

Python3中,str類型存unicode數據,bytse類型存bytes數據。

And, 文件默認的編碼方式就是utf-8。

下面給個圖來加深一下記憶:

下面到舉栗子時間:

a = '我愛排球,有人要打球嗎?'
print(type(a))
<class 'str'>
a.encode()
b'\xe6\x88\x91\xe7\x88\xb1\xe6\x8e\x92\xe7\x90\x83\xef\xbc\x8c\xe6\x9c\x89\xe4\xba\xba\xe8\xa6\x81\xe6\x89\x93\xe7\x90\x83\xe5\x90\x97\xef\xbc\x9f'

上面的是用默認的UTF-8去encode變量a,下面試一下encode為GBK類型

a.encode('GBK')
b'\xce\xd2\xb0\xae\xc5\xc5\xc7\xf2\xa3\xac\xd3\xd0\xc8\xcb\xd2\xaa\xb4\xf2\xc7\xf2\xc2\xf0\xa3\xbf'

上面展示了編碼過程,接下來展示解碼操作,解碼經常出錯,所以要留心哦

b = '下午四點全隊集合,東區氣排場' 
print(type(b))
b1 = b.encode()
b2 = b.encode('GBK')
<class 'str'>
print(type(b1))
print(type(b2))
<class 'bytes'>
<class 'bytes'>

先把b以兩種編碼形式編好,一個是b1(UTF-8編碼的),另一個是b2(GBK編碼的)

用誰編碼的,就只能用誰去解碼,不然會報錯

下面,我們不這么干,先來個亂碼情況:

b1是UTF-8編碼的,但是我們用GBK去解碼

b1.decode('GBK')
'涓嬪崍鍥涚偣鍏ㄩ槦闆嗗悎錛屼笢鍖烘皵鎺掑満'

啊哈哈,你看出上面輸出的是什么嗎,反正我看不出

這就是常見的亂碼情況。

下面是時候正常解碼一下啦!

b1.decode('UTF-8')
'下午四點全隊集合,東區氣排場'

So,亂碼就是這么一回事,他只是缺少一個對的翻譯官。你要做的就是幫他找一個正確的翻譯官。兄弟,加油,你是個稱職的媒婆,你可以的

好了,我要去找吃的了。吃,吃,吃 ,我要胖十斤


免責聲明!

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



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