UTF-8 - 相互矛盾的定义

UTF-8 - contradictory definitions

我对UTF-8编码的理解是,UTF-8字符的第一个字节要么携带

  1. 低 7 位 (0-6) 中的数据,高位 (7) 清除单字节 ASCII 范围代码点
  2. 低 5 位 (0-4) 中的数据,高位 7-5 = 110 表示一个 2 字节字符
  3. 低4位(0-3)的数据,高位7-4 = 1110表示一个3字节的字符
  4. 低5位(0-2)的数据,高位7-3 = 11110表示一个4字节的字符

注意到第 7 位总是被设置,这告诉 utf-8 解析器这是一个多字节字符。

这意味着 128-255 范围内的任何 unicode 代码点都必须以 2 个或更多字节编码,因为如果它们以一个字节编码,则所需的高位在 UTF 中保留- 8 为 'multi-byte indicator bit'。所以例如字符 é(e-acute,它是 unicode 代码点 \u00E9,十进制为 233)在 UTF-8 中编码为两字节字符 \xC3A9.

来自 here 的以下 table 显示代码点 \u00E9 如何在 UTF-8 中编码为 \xC3A9。

然而,这似乎不是它在网页中的工作方式。我最近在 unicode 字符的渲染中有一些矛盾的行为,在我的探索性阅读中遇到了这个:

这显然与上述矛盾。

如果我在 jsfiddle 中呈现这些不同的值,我会得到

所以 HTML 将 unicode 代码点 呈现为 é,而不是该代码点的 UTF-8 2 字节编码。事实上 HTML 将 UTF-8 字符 \xC3A9 呈现为具有代码点 \xC3A9:

的韩文音节

W3schools 有一个 table 明确定义 é 的 UTF-8 为 Decimal 233 (\xE9):

所以 HTML 正在呈现代码点,而不是 UTF-8 字符。

我是不是漏掉了什么?任何人都可以向我解释为什么在所谓的 UTF-8 HTML 文档中,似乎根本没有进行 UTF-8 解析吗?

你对UTF-8字节编码的理解是正确的。

您的 jsfiddle 示例仅使用 UTF-8 作为 HTML 文件的字节编码(因此使用 <meta charset="UTF-8"> HTML 标记),而不是作为编码HTML 本身。 HTML 仅使用 ASCII 字符作为其标记,但该标记可以 表示 Unicode 字符。

UTF-8 是 Unicode 代码点的字节编码。它通常用于传输 Unicode 数据,例如通过 HTTP 传输 HTML 文件。但是 HTML 本身只是根据 Unicode 代码点定义的,而不是专门用 UTF-8 定义的。网络浏览器将通过线路接收原始 UTF-8 字节并将它们解码为 Unicode 代码点,然后在 HTML.

的上下文中处理它们

HTML 实体仅处理 Unicode 代码点,而不处理代码单元,例如在 UTF-8 中使用的。

HTML &#<xxx>; 格式的实体直接用数值表示 Unicode 代码点。

  • &#233; (é) 和 &#xE9; (é) 分别表示十进制和十六进制格式的整数 233。 233 是 Unicode codepoint U+00E9 LATIN SMALL LETTER E WITH ACUTE 的数值,用 UTF-8 字节编码为 0xC3 0xA9.

  • &#xc3a9; (쎩) 表示十六进制格式 (0xC3A9) 的整数 50089。 50089 是 Unicode codepoint U+C3A9 HANGUL SYLLABLE SSYEOLG 的数值,以 UTF-8 编码为字节 0xEC 0x8E 0xA9.

HTML &<name>; 格式的实体通过 HTML.

定义的人类可读名称表示 Unicode 代码点
  • &eacute; (é) 表示 Unicode 代码点 U+00E9,与 &#233;&#xE9; 相同。