这是一个仅适用于 Python 3 的简单解释的尝试。我希望来自外行,这将有助于为完全外行的人消除一些困惑。如果有任何技术上的不准确之处,请原谅我并随时指出。
假设您以通常的方式使用 Python 3 创建一个字符串:
stringobject = 'ant'
stringobject 将是一个 unicode 字符串。
unicode 字符串由 unicode 字符组成。在上面的stringobject 中,unicode 字符是单个字母,例如a, n, t
每个 unicode 字符都分配有一个代码点,该代码点可以表示为一系列十六进制数字(一个十六进制数字可以取 16 个值,范围从 0-9 和 A-F)。例如,字母'a' 等价于'\u0061','ant' 等价于'\u0061\u006E\u0074'。
所以你会发现,如果你输入,
stringobject = '\u0061\u006E\u0074'
stringobject
您还将获得输出'ant'。
现在,unicode 被转换为字节,在一个称为 encoding 的过程中。 将字节转换为 unicode 的逆过程称为解码。
这是怎么做到的?由于每个十六进制数字可以取 16 个不同的值,因此可以体现为 4 位二进制序列(例如十六进制数字 0 可以二进制表示为 0000,十六进制数字 1 可以表示为 0001 等等)。如果一个 unicode 字符的代码点由四个十六进制数字组成,则需要一个 16 位二进制序列来对其进行编码。
不同的编码系统为将 unicode 转换为位指定了不同的规则。最重要的是,编码用于表示每个 unicode 字符的位数不同。
例如,ASCII 编码系统每个字符仅使用 8 位(1 个字节)。因此,它只能对 unicode 字符进行编码,其代码点最长为两个十六进制数字(即 256 个不同的 unicode 字符)。 UTF-8 编码系统每个字符使用 8 到 32 位(1 到 4 个字节),因此它可以对 unicode 字符进行编码,其代码点最长为 8 个十六进制数字,即一切。
运行以下代码:
byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)
使用 utf-8 编码系统将 unicode 字符串转换为字节字符串,并返回 b'ant', bytes'。
请注意,如果您使用 'ASCII' 作为编码系统,则不会遇到任何问题,因为 'ant' 中的所有代码点都可以用 1 个字节表示。但如果你有一个 unicode 字符串,其中包含的字符的代码点长于两个十六进制数字,你会得到一个 UnicodeEncodeError。
同样,
stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)
给你'ant', str。