HTML(5)是否忽略字素?

时间:2015-02-23 20:35:06

标签: html html5 unicode utf-8 html-parsing

grapheme是写作中最小的“单位”。在英语中,我们通常只考虑字符A-Z,但其他语言都有重音。 UTF允许您向字符添加重音以形成字形。有一个generalized algorithm允许您将一系列UTF代码点分解为逻辑字形集群(其中每个代码点集合代表一个字形)。

举例来说:

  

&LT峰; br>̗̘̈̉̊̋

上述文字中有四个字形:<̖̈̌̍br>̗̘̈̉̊̋(请注意<̖̈̌̍>̗̘̈̉̊̋实际上只有<>以及其他重音符号。如果我把它放在HTML文档中:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>

  <body>
    <̖̈̌̍br>̗̘̈̉̊̋
  </body>
</html>

它无法使用我发现的实验验证器进行验证。这些验证器似乎使用代码点而不是字形进行解析,因此会抱怨<后面的重音代码点(无法形成有效的HTML5标记)。

鉴于这些验证器是实验性的,我不知道我是否应该完全信任他们的结果。

HTML5是否会忽略字形,只关心代码点?

1 个答案:

答案 0 :(得分:2)

HTML规范的

2.1.6 Character encodings说:

  

术语 Unicode代码点在可能的情况下表示 Unicode标量值,在没有时表示隔离的代理代码点。当根据字符或Unicode代码点定义一致性要求时,必须将一对由高代理项后跟低代理项组成的code units视为代理项对代表的单个代码点,但是隔离的代理项必须将每个都视为具有代理值的单个代码点。

     

在本规范中,术语字符在未被限定为 Unicode 字符时,与术语Unicode code point同义。

     

术语 Unicode字符用于表示 Unicode标量值(即任何不是代理代码点的Unicode代码点)。

然后,稍后,在8.1.2.1 Start tags8.1.2.2 End tags中,它使用字符这个词进行定义(从上面我们知道它与 Unicode代码点同义)。

这意味着当它遇到<̖̈̌̍时,它实际上只是解析代码点序列U+003CU+0316U+0308U+030C和{ {3}}。它忽略了字形的概念。

有趣的是,这意味着结束标记>̗̘̈̉̊̋仍然是一个“有效”的HTML结束标记。代码点序列为U+030DU+003EU+0317U+0318U+0308U+0309U+030A。第一个代码点(U + 003E)只是>,因此它被用作结束标记。就解析器而言,以下代码点(U+030B)只是普通的“文本”(这不是完全有效的UTF)。那么,渲染器将会做什么仍然是一个问题:组合代码点是否会被渲染为垃圾,或者它们是否会与刚刚关闭的标记之前的字符组合?

但结论是,在HTML解析中不使用字形。只是代码点。