【问题标题】:Confused about hex vs utf-8 encoding对 hex 与 utf-8 编码感到困惑
【发布时间】:2020-04-12 11:10:52
【问题描述】:

让我们以字符 ñ (unicode-table) 为例。

当我运行 ord('ñ') 时,我会返回 241 - 即它是第 241 个编码字符。
当我运行hex(ord('ñ')) 时,我会返回0xf1,这是241 的十六进制值。

那么为什么当我运行'ñ'.encode('utf-8') 时,我会以十进制返回b'\xc3\xb1'50097?我们不是刚刚确认ñf1(十六进制)还是241(十进制)?

【问题讨论】:

  • TL;DR:UTF-8 并不简单地将 Unicode 码位值直接编码为字节,它比这要复杂一些。

标签: python utf-8 character-encoding


【解决方案1】:

241 是对应于字形“LATIN SMALL LETTER N WITH TILDE”的 unicode 代码点。在 Python 中,字符在内部存储为其 unicode 代码点,因此 ord('ñ') 是 241。

编码是字符到字节的映射。不同的编码可能使用也可能不使用相同的字节来表示相同的字符。

>>> 'ñ'.encode('utf-8')
b'\xc3\xb1'
>>> 'ñ'.encode('latin-1')
b'\xf1'
>>> 'ñ'.encode('cp1252')
b'\xf1'
>>> 'ñ'.encode('cp1254')
b'\xf1'
>>> 'ñ'.encode('utf-16')
b'\xff\xfe\xf1\x00'
>>> 'ñ'.encode('utf-32')
b'\xff\xfe\x00\x00\xf1\x00\x00\x00'

如果您在没有提供目标编码的情况下调用str.encode(),Python 将选择系统默认值 - 在您的情况下为 UTF-8。

总结一下:

  • ord(s) 返回特定字符的 unicode 代码点
  • s.encode('<some encoding>') 在提供的编码中返回映射到该字符的字节

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-12-17
    • 1970-01-01
    • 2019-09-13
    • 2012-07-22
    相关资源
    最近更新 更多