哪些是HTML和XML的特殊字符?

28
在HTML和XML中,有哪些特殊保留字符实体?
我所了解的信息如下:
HTML:
- & (替换为&) - < (替换为&lt;) - > (替换为&gt;) - " (替换为&quot;) - ' (替换为&apos;)
XML:
- < (替换为&lt;) - > (替换为&gt;) - & (替换为&amp;) - ' (替换为&apos;) - " (替换为&quot;)
但我找不到任何文件来证明这些实体。
可扩展标记语言(XML)1.0(第五版)中,W3C确实提到了某些预定义实体引用。但是它说这些实体是预定义的(就像&copy;是预定义的一样),而不是必须转义的:

4.6 预定义实体

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

HTML中,哪些字符必须转义为实体引用? 在XML中,哪些字符必须转义为实体引用?
更新:可扩展标记语言(XML) 1.0 (第五版)中:

2.4 字符数据和标记

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

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

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

我认为前面的话是说

必须是:

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

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

  • > (&gt;) 必须是,如果出现]]>

'"根本不需要转义;除非您想在引用属性中使用引号。


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

5.3.2 字符实体引用

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

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

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

一些作者使用字符实体引用“&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;

1
你应该将你的问题与回答分开。 - John Saunders
1
我没有答案。我有可能正确也有可能不正确的研究成果。知道答案的人可以发表它,如果确实正确,那么知道的人可以投赞成票。 - Ian Boyd
2
如果上述不是答案,那么您需要更清楚地表明您所寻找的内容! - John Saunders
1
我找到了五个不同的来源,它们说了三种不同的事情。需要有人知道并决定哪一个来源是正确的,哪一个是错误的。 - Ian Boyd
HTML 4和5在关于何时应该转义>(在属性中还是不在属性中)方面提出了相反的观点,这很奇怪。 - LarsH
1个回答

12
首先,您正在比较一个HTML 4.01规范和一个HTML 5规范。HTML5与XML的联系比HTML 4.01更紧密(这就是为什么我们有XHTML),因此本答案将专注于HTML 5和XML。
您引用的参考文献在以下几点上都是一致的:
  • 当不表示处理指令时,<应始终使用&lt;表示
  • 当不表示处理指令时,>应始终使用&gt;表示
  • &应始终使用&amp;表示
  • 除非<![CDATA[ ]]>内(仅适用于XML)
我完全同意这一点。您永远不希望解析器将文字误认为是指令,因此始终对任何非空格(请参见下文)字符进行编码是一个可靠的想法。好的解析器知道包含在<![CDATA[ ]]>中的任何内容都不是指令,因此不需要进行编码。
实际上,除非
  • 它出现在属性值中(XML或HTML)
  • 它出现在XML标签的文本中。(<tag>&quot;Yoinks!&quot;, he said.</tag>

两个规范都同意这一点。

因此,唯一争议的是(空格)。任何一个规范中唯一提到它的地方都是在尝试序列化时。如果不是,则应始终使用字面意义上的(空格)。除非您正在编写自己的解析器,否则我不认为有必要进行任何类型的序列化,因此这是无关紧要的。


2
除了在 XML 线性化数据中出现 ]]> 的非常特殊和极为罕见的情况外,没有理由转义 >。如果需要对称(与转义 < 相对应),则可以进行转义。这就是参考资料实际上所说的内容。而且,除非在属性值内使用相同字符作为属性值分隔符,否则没有理由转义 '" - Jukka K. Korpela
1
如果您只在引号出现在属性值或元素文本内容中时进行编码,那么除了这些情况之外,哪些情况下出现的文本不需要转义呢? - dan carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接