grapheme是写作中最小的“单位”。在英语中,我们通常只考虑字符A-Z,但其他语言都有重音。 UTF允许您向字符添加重音以形成字形。有一个generalized algorithm允许您将一系列UTF代码点分解为逻辑字形集群(其中每个代码点集合代表一个字形)。
举例来说:
&LT峰; br>̗̘̈̉̊̋
上述文字中有四个字形:<̖̈̌̍
,b
,r
和>̗̘̈̉̊̋
(请注意<̖̈̌̍
和>̗̘̈̉̊̋
实际上只有<
和>
以及其他重音符号。如果我把它放在HTML文档中:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<̖̈̌̍br>̗̘̈̉̊̋
</body>
</html>
它无法使用我发现的实验验证器进行验证。这些验证器似乎使用代码点而不是字形进行解析,因此会抱怨<
后面的重音代码点(无法形成有效的HTML5标记)。
鉴于这些验证器是实验性的,我不知道我是否应该完全信任他们的结果。
HTML5是否会忽略字形,只关心代码点?
答案 0 :(得分:2)
术语 Unicode代码点在可能的情况下表示 Unicode标量值,在没有时表示隔离的代理代码点。当根据字符或Unicode代码点定义一致性要求时,必须将一对由高代理项后跟低代理项组成的code units视为代理项对代表的单个代码点,但是隔离的代理项必须将每个都视为具有代理值的单个代码点。
在本规范中,术语字符在未被限定为 Unicode 字符时,与术语Unicode code point同义。
术语 Unicode字符用于表示 Unicode标量值(即任何不是代理代码点的Unicode代码点)。
然后,稍后,在8.1.2.1 Start tags和8.1.2.2 End tags中,它使用字符这个词进行定义(从上面我们知道它与 Unicode代码点同义)。
这意味着当它遇到<̖̈̌̍
时,它实际上只是解析代码点序列U+003C,U+0316,U+0308,U+030C和{ {3}}。它忽略了字形的概念。
有趣的是,这意味着结束标记>̗̘̈̉̊̋
仍然是一个“有效”的HTML结束标记。代码点序列为U+030D,U+003E,U+0317,U+0318,U+0308,U+0309和U+030A。第一个代码点(U + 003E)只是>
,因此它被用作结束标记。就解析器而言,以下代码点(U+030B)只是普通的“文本”(这不是完全有效的UTF)。那么,渲染器将会做什么仍然是一个问题:组合代码点是否会被渲染为垃圾,或者它们是否会与刚刚关闭的标记之前的字符组合?
但结论是,在HTML解析中不使用字形。只是代码点。