【问题标题】:Does HTML(5) ignore graphemes?HTML(5) 会忽略字素吗?
【发布时间】:2015-04-25 07:36:42
【问题描述】:

grapheme 是写作中最小的“单位”。在英语中,我们通常只会想到字符 A-Z,但其他语言有口音。 UTF 允许您向字符添加重音符号以形成字素。有一个 generalized algorithm 可让您将 UTF 代码点序列分解为逻辑字素簇(其中每个代码点簇代表一个字素)。

举个例子:

̗̘̈̉̊̋

上面的文字中有四个字素:<̖̈̌̍br>̗̘̈̉̊̋(注意<̖̈̌̍>̗̘̈̉̊̋实际上只是<>加上额外的口音)。如果我把它放在 HTML 文档中:

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

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

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

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

HTML5 会忽略字素,而只关心代码点吗?

【问题讨论】:

    标签: html unicode utf-8 html-parsing


    【解决方案1】:

    HTML 规范的2.1.6 Character encodings 说:

    Unicode 代码点 一词在可能的情况下表示 Unicode 标量值,在可能情况下表示孤立的代理代码点。当以字符或 Unicode 代码点定义一致性要求时,必须将由高代理项和低代理项组成的 code units 对视为代理项对表示的单个代码点,但每个独立代理项必须被视为具有代理项值的单个代码点。

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

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

    然后,稍后,在 8.1.2.1 Start tags8.1.2.2 End tags 中,它使用单词 character 定义事物(从上面我们知道,它是 Unicode 代码点的同义词)。

    这意味着当它遇到&lt;̖̈̌̍时,实际上只是解析U+003CU+0316U+0308U+030CU+030D的码位序列。它忽略了字素的概念。

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

    但结论是,字素不用于 HTML 解析。只是代码点。

    【讨论】:

    • +1 ...应该是这样,因为计算字素边界的规则非常复杂,并且会不断修订。它们不应该是标记解析器的一部分。代码点应该确实是解析单元,尽管此后的 DOM 字符串模型基于 UTF-16 代码单元而不是代码点,并且在某些情况下,可能会通过解析器潜入无效的代理序列.
    猜你喜欢
    • 2011-03-21
    • 2016-12-13
    • 2021-05-22
    • 2019-03-07
    • 2019-08-02
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多