29

HTML 和 XML 中的特殊保留字符实体是什么?

我所掌握的信息是:

HTML:

  • & (替换为&
  • < (替换为&lt;
  • > (替换为&gt;
  • " (替换为&quot;
  • ' (替换为&apos;

XML:

  • < (替换为&lt;
  • > (替换为&gt;
  • & (替换为&amp;
  • ' (替换为&apos;
  • " (替换为&quot;

但我找不到关于其中任何一个的文档。

W3C 在可扩展标记语言 (XML) 1.0(第五版)中确实提到了某些预定义的实体引用。但它说这些实体是预定义的(以与预定义相同的方式&copy;);并不是说他们必须逃脱:

4.6 预定义实体

[定义:实体和字符引用都可以用来 转义左尖括号、& 和其他分隔符。为此目的指定了一组通用实体(amp、lt、gt、apos、quot)。也可以使用数字字符引用;它们在识别时立即展开并且必须被视为字符数据,因此数字字符引用“ < ”和“ & ”可用于转义 < 和 & 当它们出现在字符数据中时。]

哪些字符必须转义到HTML中的实体引用中?哪些字符必须转义到XML中的实体引用中?


更新

来自可扩展标记语言 (XML) 1.0(第五版)

2.4 字符数据和标记

& 符号 ( &) 和左尖括号 ( <)不得 以其文字形式出现,除非用作标记分隔符,或者在注释、处理指令或 CDATA 部分中。如果在其他地方需要它们,它们必须分别使用数字字符引用或字符串“ &amp;”和“ &lt;”进行转义。

右尖括号 ( >) 可以使用字符串 " &gt;" 表示,并且为了兼容性,当它出现在内容中的字符串 " " 中时,必须使用 " &gt;" 或字符引用进行转义]]>,当该字符串未标记结束时的 CDATA 部分。

为了允许属性值包含单引号和双引号,撇号或单引号字符 ( ') 可以表示为 " &apos;",双引号字符 ( ") 表示为 " &quot;"。

我读到前者是这样说的

必须是

  • <( &lt;) 必须是
  • &( &amp;) 必须是

可以,但当出现时必须]]>

  • >( &gt;) 必须是,如果显示为]]>

并且'根本"不必逃避;除非您想在带引号的属性中加上引号。


来自HTML 4.01 规范,HTML 文档表示

5.3.2 字符实体引用

希望将“ <”字符放入文本中的作者应使用“ &lt;”(ASCII 十进制 60)以避免可能与标记开头(开始标记打开分隔符)混淆。

同样,作者应该&gt;在文本中使用“”(ASCII 十进制 62)而不是“ >”,以避免旧用户代理在出现在引用的属性值中时错误地将其视为标记的结尾(标记关闭分隔符)的问题。

作者应使用“ &amp;”(ASCII 十进制 38)而不是“ &”,以避免与字符引用的开头混淆(实体引用打开分隔符)。作者还应该在属性值中使用“ &amp;”,因为在 CDATA 属性值中允许字符引用。

一些作者使用字符实体引用“ &quot;”来编码双引号 ( ") 的实例,因为该字符可用于分隔属性值。

HTML 在规则上更加空泛,但听起来我应该

  • <应该与&lt;
  • >应该与&gt;
  • &应该与&amp;
  • "应该与&quot;

如果"可以是实体引用,我也应该替换'&amp;.


更新二

来自HTML5 - HTML 和 XHTML 的词汇表和相关 API

8.3 序列化 HTML 片段

转义字符串(出于上述算法的目的)包括运行以下步骤:

用字符串“”替换任何出现的“ &”字符&amp;

用字符串“”替换任何出现的 U+00A0 NO-BREAK SPACE 字符&nbsp;

如果算法是在属性模式下调用的,则用字符串“”替换任何出现的“ "”字符&quot;

如果在属性模式下没有调用算法,则将任何出现的“ <”字符替换为字符串“ &lt;”,并将任何出现的“ >”字符替换为字符串“ &gt;”。

我读为HTML

  • &&amp;总是_
  • &nbsp;总是_
  • "&quot;如果它在属性内
  • <&lt;如果它不在属性中(即属性可以包含<
  • >&gt;如果它不在属性中(即属性可以包含>
4

1 回答 1

13

首先,您将HTML 4.01 规范HTML 5规范进行比较。HTML5 与 XML 的联系比 HTML 4.01 更紧密(这就是我们有 XHTML 的原因),所以这个答案将坚持 HTML 5 和 XML。

您引用的参考文献在以下几点上都是一致的:

  • <&lt;不指示处理指令时应始终表示为
  • >&gt;不指示处理指令时应始终表示为
  • &应始终表示为&amp;
  • 除非在内部<![CDATA[ ]]>(仅适用于 XML)

我 100% 同意这一点。您永远不希望解析器将文字误认为是指令,因此始终对任何非空格(见下文)字符进行编码是一个不错的主意。好的解析器知道其中包含的任何内容<![CDATA[ ]]>都不是指令,因此那里不需要编码。

在实践中,我从不编码'"除非

  • 它出现在属性值(XML 或 HTML)中
  • 它出现在 XML 标记的文本中。( <tag>&quot;Yoinks!&quot;, he said.</tag>)

这两个规范也同意这一点。

所以,唯一的争论点是(空间)。在任一规范中唯一提到它是在尝试序列化时。如果不是,您应该始终使用文字(空格)。除非您正在编写自己的解析器,否则我认为不需要进行任何类型的序列化,所以这是无关紧要的。

于 2011-09-02T03:48:38.403 回答