Python 字符編碼與解碼是什麼
在 Python3 中字符默認編碼是 Unicode 字符,而編碼指的是將字符轉換成字節流,解碼是相反的操作。
在正式開始前,我們還需要梳理一些基本概念
Python 中的字符串
計算機中 8 比特(bit)等於一個字節(byte),8 比特就是 8 位,即一個字節能表示的最大整數是 255(1111 1111)。
如果希望擴大整數范圍,需要用到更多的字節,例如 2 個字節就可以表示 65535,4 個字節就能表示 4294967295。
基於上述原理出現了各種編碼格式,例如
ASCII
可以表示 256 個字符,但僅支持英文字母,數字和少部分符號,中文的范圍要大很多,所以出現了 GB2312 編碼(後來升級到了 GBK 編碼),可以容納 6763 個漢字,但放眼世界還不夠,還需要更多的字符。
此時 Unicode 字符集就出現了,它將所有的語言都容納在一起,後續為了在存儲和傳輸數據時節省空間,出現了 UTF8 編碼。
怎麼用
Python 編碼基本使用
通過
ord()
函數獲取字符的整數表示,通過
chr()
將整數轉換為字符,例如下述代碼
print(ord('爬')) # 29228
print(chr(29228))
既然知道數字可以轉換為數字,那十進制和十六進制的數字都可以。
例如
29228
=
722c
,所以
\u722c
print(chr(int('722c', 16)))
也可以使用 Unicode 轉碼工具進行轉換。
Python 編碼和解碼函數
encode()
和
decode()
分別對應編碼和解碼函數,
en
是編碼,
de
是解碼。
my_b = '技能樹'.encode('utf-8')
print('編碼後',my_b) # 編碼後 b'\xe6\x8a\x80\xe8\x83\xbd\xe6\xa0\x91'
解碼操作如下所示:
my_b = '技能樹'.encode('utf-8')
print('編碼後', my_b) # 編碼後 b'\xe6\x8a\x80\xe8\x83\xbd\xe6\xa0\x91'
my_str = my_b.decode('utf-8')
print("解碼後", my_str)
需要注意編碼後輸出的內容與字符串類似,就是前面有一個前綴 b
。亂碼
如果編碼和解碼方法不一致,就會出現亂碼問題,例如下述代碼
my_b = '技能樹'.encode('gbk')
print('編碼後', my_b) # 編碼後 b'\xbc\xbc\xc4\xdc\xca\xf7'
my_str = my_b.decode('utf-8')
print("解碼後", my_str)
出錯信息如下所示:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in position 0: invalid start byte
當出現上述類型的錯誤時,需要做的就是尋找到正確的原編碼,然後進行處理。