爲了溝通的便利,Unicode(萬國碼)應運而生,這套編碼表將世界上所有的符號都納入其中。每個符號都有一個獨一無二的編碼,現在Unicode可以容納100多萬個符號,所有語言都可以互通,一個網頁上也可以顯示多國語言。
看起來皆大歡喜。但是!問題又來了,自從英文世界喫上了Unicode這口大鍋飯,爲遷就一些佔用字節比較多的語言,英文也要跟着佔兩個字節。比如要存儲A,原本00010001就可以了,現在偏得用兩個字節:00000000 00010001纔行,這樣對計算機空間存儲是種極大的浪費!
基於這個痛點,科學家們又提出了天才的想法:UTF-8(8-bit Unicode Transformation Format)。它是一種針對Unicode的可變長度字符編碼,它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,而當字符在ASCII碼的範圍時,就用一個字節表示,所以UTF-8還可以兼容ASCII編碼。
在Python3當中,程序處理我們輸入的字符串,是默認使用Unicode編碼的,所以你什麼語言都可以輸入。
Unicode與UTF-8這種曖昧的關係一言以蔽之:Unicode是內存編碼的規範,而UTF-8是如何保存和傳輸Unicode的手段。
print('吳楓'.encode('utf-8'))
print('吳楓'.encode('gbk'))
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8'))
print(b'\xce\xe2\xb7\xe3'.decode('gbk'))
encode:變成bytes,按某種編碼方式
decode:把bytes變成字符,按某種編碼方式