亂碼這種東西,時不時出現。原本開開心心想着我要學習啦,而後興高采烈打開了比火星文還火星文的字符…… 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,亂碼就是這麼一回事,他只是缺乏一個對的翻譯官。你要作的就是幫他找一個正確的翻譯官。兄弟,加油,你是個稱職的媒婆,你能夠的
好了,我要去找吃的了。吃,吃,吃 ,我要胖十斤