编码/解码本质上是一种映射
字符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')
# 中文不支持 ascii 编码
>>> str = 'abc123'
>>> str.encode('ascii')
b'abc123'
bytes 样式类型 主要在于使用 raw_unicode_escape 编码
unicode 样式类型 主要在于使用 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") # '名称'
>>> u_code = 'abc你好123'.encode('unicode-escape')
>>> u_code, type(u_code)
(b'abc\\u4f60\\u597d123', <class 'bytes'>)
>>> u_str = 'abc\u4f60\u597d123'
>>> u_b = u_str.encode('unicode-escape')
>>> u_b, type(u_b)
(b'abc\\u4f60\\u597d123', <class 'bytes'>)
... str2 = u_b.decode('utf-8')
>>> str2, type(str2)
('abc\\u4f60\\u597d123', <class 'str'>)
>>> str3 = str2.encode()
>>> str3, type(str3)
(b'abc\\u4f60\\u597d123', <class 'bytes'>)
>>> str4 = str3.decode('unicode-escape')
>>> str4, type(str4)
('abc你好123', <class 'str'>)
使用 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(五)