str.encode() 给出意想不到的结果

Hav*_*day 5 python character-encoding

我一直在玩 python 内置函数,并得到了一些令人困惑的(对我来说)结果。

看看这段代码:

>>> 'ü'.encode()
b'\xc3\xbc'
Run Code Online (Sandbox Code Playgroud)

为什么\xc3\xbc返回(十进制的 195 和 188)?如果您查看ascii 表,我们会看到它ü是第 129 个字符。或者,如果您查看此处,我们会看到这ü是第 252 个 Unicode 字符,这就是您从中得到的

>>> ord('ü')
252
Run Code Online (Sandbox Code Playgroud)

那么来自哪里\xc3\xbc,为什么它被分成两个字节?当你 decode: 时b'\xc3\xbc'.decode(),它怎么知道这两个字节是一个字符?

Sil*_*olo 6

在您正在查看的表格上,您正在查看标题为“扩展 ASCII”的部分,在ISO/IEC 8859或 latin1 中更为常见。ASCII 作为字符集,定义了 0 到 127 之间的 7 位字符。latin1 定义了其他 128 个单字节字符,是 ASCII 的扩展。Python 使用 UTF-8,它扩展了 ASCII(因此与它兼容)但与 latin1 不兼容。

字符 ü 具有 Unicode 代码点 0xFC(十进制为 252),并且在使用 UTF-8 时,使用两个字符进行编码。

许多在线 ASCII 表都弄错了。将代码点称为 128 到 255 个 ASCII 字符是不准确的,因为 ASCII 没有声称为这些代码点分配任何值。

  • 是的,字节字符串由两个字节组成:195 和 188(十六进制表示为 0xC3 和 0xBC)。与代码点 252 相关的具体细节实际上只是一堆按位算术,您可以在 [维基百科](https://en.wikipedia.org/wiki/UTF-8) 上阅读所有相关内容 (4认同)
  • UTF-8 有效地将 ASCII 字符 (0-127) 编码为单个字节。最后我检查了 UNICODE 现在的字符最大为 0x10FFFD。它显然无法用 1 个字节对每个字符进行唯一编码。每个字符 3 个字节可以工作,但效率很低。最常见的字符使用一个字节进行编码,但必须保留一些字节以指示后面有其他字节。254 可以表示后面还有 2 个字节,255 可以表示后面还有 3 个字节,但这将使代码分别长 3 和 4 个字节。折衷方案是使用更多字节作为多字节代码前缀。 (3认同)
  • 确切地。如果您将“latin-1”作为参数传递给“encode”,您将得到您想要的结果。 (2认同)