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

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

沒事,我能夠搞定這堆鬼畫符。 程序員

先來說一下爲何有亂碼這種東西的存在面試

故事是這樣滴:學習

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

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

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

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

最先的對照表是ASCII碼錶,ASCII碼錶是美國人創造出來的,總共128個字符,知足美國人民的平常需求!blog

可是!!!utf-8

世界那麼大,每一個國家都有本身的文字、符號,人類一直在擴充這張對照表,陸續創造了:擴展ASCII碼、GB23十二、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,亂碼就是這麼一回事,他只是缺乏一個對的翻譯官。你要作的就是幫他找一個正確的翻譯官。兄弟,加油,你是個稱職的媒婆,你能夠的

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

相關文章
相關標籤/搜索