UTF-8 - 相互矛盾的定义
UTF-8 - contradictory definitions
我对UTF-8编码的理解是,UTF-8字符的第一个字节要么携带
- 低 7 位 (0-6) 中的数据,高位 (7) 清除单字节 ASCII 范围代码点
- 低 5 位 (0-4) 中的数据,高位 7-5 = 110 表示一个 2 字节字符
- 低4位(0-3)的数据,高位7-4 = 1110表示一个3字节的字符
- 低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 字符的渲染中有一些矛盾的行为,在我的探索性阅读中遇到了这个:
- “对于从 160 到 255 的值,UTF-8 与 ANSI 和 8859-1 相同。” (w3schools)
这显然与上述矛盾。
如果我在 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。 233 是 Unicode codepoint U+00E9 LATIN SMALL LETTER E WITH ACUTE
的数值,用 UTF-8 字节编码为 0xC3 0xA9
.
쎩
(쎩) 表示十六进制格式 (0xC3A9) 的整数 50089。 50089 是 Unicode codepoint U+C3A9 HANGUL SYLLABLE SSYEOLG
的数值,以 UTF-8 编码为字节 0xEC 0x8E 0xA9
.
HTML &<name>;
格式的实体通过 HTML.
定义的人类可读名称表示 Unicode 代码点
é
(é) 表示 Unicode 代码点 U+00E9
,与 é
和 é
相同。
我对UTF-8编码的理解是,UTF-8字符的第一个字节要么携带
- 低 7 位 (0-6) 中的数据,高位 (7) 清除单字节 ASCII 范围代码点
- 低 5 位 (0-4) 中的数据,高位 7-5 = 110 表示一个 2 字节字符
- 低4位(0-3)的数据,高位7-4 = 1110表示一个3字节的字符
- 低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 字符的渲染中有一些矛盾的行为,在我的探索性阅读中遇到了这个:
- “对于从 160 到 255 的值,UTF-8 与 ANSI 和 8859-1 相同。” (w3schools)
这显然与上述矛盾。
如果我在 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。 233 是 Unicode codepointU+00E9 LATIN SMALL LETTER E WITH ACUTE
的数值,用 UTF-8 字节编码为0xC3 0xA9
.쎩
(쎩) 表示十六进制格式 (0xC3A9) 的整数 50089。 50089 是 Unicode codepointU+C3A9 HANGUL SYLLABLE SSYEOLG
的数值,以 UTF-8 编码为字节0xEC 0x8E 0xA9
.
HTML &<name>;
格式的实体通过 HTML.
é
(é) 表示 Unicode 代码点U+00E9
,与é
和é
相同。