編碼/解碼本質上是一種映射
字符a
用 ascii 編碼則是65,計算機中存儲為 00110101。a
需要解碼為 00110101,才能被計算機使用。
編碼:真實字符與二進制串的對應關系,真實字符 → 二進制串
解碼:二進制串與真實字符的對應關系,二進制串 → 真實字符
如:
UTF-8 --> decode 解碼 --> Unicode
Unicode --> encode 編碼 --> GBK / UTF-8 等
ASCII 以 1字節 8個bit位表示一個字符,首位全是0,表示的字符集明顯不夠
unicode 編碼系統是為表達任意語言而設計的,為了防止存儲上的冗余(比如,對應ascii碼的部分),其采用了變長編碼,但變長編碼給解碼帶來了困難,無法判斷是幾個字節表示一個字符
UTF-8 是針對unicode變長編碼設計的一種前綴嗎,根據前綴可判斷是幾個字節表示一個字符
Python 中的默認編碼
str = '你好' # b'\xe4\xbd\xa0\xe5\xa5\xbd' gbk:b'\xc4\xe3\xba\xc3'
str = 'abc' # b'abc'
str = 'นั่ง' # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88\xe0\xb8\x87'
str = 'นั่' # b'\xe0\xb8\x99\xe0\xb8\xb1\xe0\xb9\x88'
# str = 2 # 'int' object has no attribute 'encode'
str = '*' # b'*'
a = str.encode('UTF-8')
a = str.encode('gbk')
print(a)
print(type(a)) # <class 'bytes'>
主要在於使用 raw_unicode_escape
編碼
str = '\xe5\x90\x8d\xe7\xa7\xb0'
str_b = str.encode("raw_unicode_escape") # b'\xe5\x90\x8d\xe7\xa7\xb0'
str_origin = str_b.decode("utf-8") # '名稱'
使用 urllib 庫
參考: https://www.cnblogs.com/miaoxiaochao/p/13705936.html
str = '你好'
a = urllib.parse.quote(str)
print(a) # %E4%BD%A0%E5%A5%BD
b = urllib.parse.unquote(a) # 你好
b = b''
b += b'a'
b += b' b'
print(b) b'a b'
print (b.decode('utf-8')) # a b
伊織 2022-06-24(五)