它是 Base 64 编码,那么它不是 UTF-16 编码,也不是 UTF-8。看看RFC 3548。 Base 64 可以在文档的第 4 页找到。
实际上,目的是不同的。 UTF-x 编码用于将 unicode 字符串编码为二进制流。也就是说,抽象字符串是解码后的形式。另一方面,Base X 和类似的编码在这里将原始二进制编码为选定的 ASCII 值(基本上是小整数)流,以便二进制内容可以通过电子邮件传输只接受字符。二进制是解码后的原始形式。
在您的情况下,看起来好像传输了一系列整数(32 位):20、3、6、9 和 12。
稍后更新以回答以下评论:我是如何获得这些值的......
b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'
文字的b 前缀表示它是具有bytes 类型值的文字。 bytes 是一个小整数流——每个字节一个字节,即从 0 到 255。当显示为文字时,如果相关的 ASCII 字符不容易显示,则使用小整数的十六进制表示法——以\x 开头,后跟两个十六进制数字。 \t 是制表符的表示形式,其序号为 9。
但是,您也可以将其转换为整数列表:
>>> list(b)
[20, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0]
现在更明显了。如果值足够小以适合单个字节,则零是填充符。字节顺序是由操作系统/机器的字节序引起的。所以,实际上,它应该是 hexa(作为 5 个 32 位整数):
00000014 00000003 00000006 00000009 0000000c
这是:
20 3 6 9 12
换句话说,b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00' 实际上不是一个字符串。它是一个 bytes 文字,它捕获 5 * 4 字节的值。 bytes 是一个小整数序列,而不是字符序列。当您尝试时会更明显:
>>> for value in b:
... print(value)
...
20
0
0
0
3
0
0
0
6
0
0
0
9
0
0
0
12
0
0
0
>>> type(b)
<class 'bytes'>
>>> type(b[0])
<class 'int'>
>>>