【发布时间】:2020-07-08 14:06:17
【问题描述】:
我对 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 中保留用于'多字节指示位'。所以例如字符 é(e-acute,它是 unicode 代码点 \u00E9,十进制 233)以 UTF-8 编码为两字节字符 \xC3A9。
here 的下表显示了代码点 \u00E9 如何以 UTF-8 编码为 \xC3A9。
但这似乎不是它在网页中的工作方式。我最近在 unicode 字符的渲染中遇到了一些矛盾的行为,在我的探索性阅读中遇到了这个:
- “对于从 160 到 255 的值,UTF-8 与 ANSI 和 8859-1 相同。” (w3schools)
这显然与上述矛盾。
如果我在jsfiddle 中呈现这些不同的值,我会得到
因此 HTML 将 unicode code-point 呈现为 é,而不是该代码点的 UTF-8 2 字节编码。事实上,HTML 将 UTF-8 字符 \xC3A9 呈现为具有代码点 \xC3A9:
的 Hangul 音节W3schools 有一个表,将 é 的 UTF-8 明确定义为十进制 233 (\xE9):
所以 HTML 是在渲染代码点,而不是 UTF-8 字符。
我在这里遗漏了什么吗?谁能向我解释为什么在一个所谓的 UTF-8 HTML 文档中,似乎根本没有 UTF-8 解析?
【问题讨论】:
-
w3school 的质量不高。我不会推荐它,而且无论如何我永远不会 100% 信任这个网站。句子“对于 160 到 255 的值,UTF-8 与 ANSI 和 8859-1 相同”。显然是错误的。他们将 Unicode 与 UTF-8 混淆了。顺便说一句,不要写
\xC3A9:这很令人困惑,而且通常不是你想的那样(在小端架构上,比如 x86)。 -
@GiacomoCatenazzi w3school 可能是错误的,但 jsfiddle 示例显示浏览器正在渲染基于代码点的字节,而不是 utf-8 字符集。
-
UTF-8 只是网络的标准编码,用于传输文件。在内部它们只是 unicode 字符,所以是的,这些代码不是 UTF-8 字节,而是代码点。
-
这里的问题是什么?是不是“谁能向我解释为什么在一个所谓的 UTF-8 HTML 文档中,似乎根本没有 UTF-8 解析?”您对什么行为感到惊讶,您期待什么?
标签: html unicode encoding utf-8