我所了解的信息如下:
HTML:
- & (替换为&) - < (替换为<) - > (替换为>) - " (替换为") - ' (替换为')
XML:
- < (替换为<) - > (替换为>) - & (替换为&) - ' (替换为') - " (替换为")
但我找不到任何文件来证明这些实体。
在可扩展标记语言(XML)1.0(第五版)中,W3C确实提到了某些预定义实体引用。但是它说这些实体是预定义的(就像
©
是预定义的一样),而不是必须转义的:
在HTML中,哪些字符必须转义为实体引用? 在XML中,哪些字符必须转义为实体引用?4.6 预定义实体
[定义:实体和字符引用都可以用于转义左尖括号、和号和其他分隔符。为此指定了一组常规实体(amp、lt、gt、apos、quot)。也可以使用数字字符引用;当它们被识别时,它们会立即扩展并必须被视为字符数据,因此数字字符引用 " <" 和 " &" 可以用于转义 < 和 & 在字符数据中出现的情况。]
更新: 从可扩展标记语言(XML) 1.0 (第五版)中:
2.4 字符数据和标记
与号字符(
&
)和左尖括号(<
) 必须不 以它们的字面形式出现,除非用作标记分隔符, 在注释、处理指令或CDATA部分内。如果它们在其他地方需要,则必须使用数字字符引用或字符串"&
"和"<
"分别进行转义。右尖括号(
>
)可以使用字符串">
"表示,并且为了兼容性,在内容中出现字符串"]]>
"时,当该字符串不标记CDATA部分的结束时,必须使用">
"或字符引用进行转义。为了使属性值包含单引号和双引号,撇号或单引号字符(
'
)可以表示为"'
",双引号字符("
)可以表示为""
"。
我认为前面的话是说
必须是:
<
(<
) 必须是&
(&
) 必须是
可以,但当出现]]>
时必须
>
(>
) 必须是,如果出现]]>
而'
和"
根本不需要转义;除非您想在引用属性中使用引号。
5.3.2 字符实体引用
希望在文本中放置“<”字符的作者应使用“<”(ASCII十进制60)以避免可能与标签(开始标记开放定界符)的开头混淆。
同样,作者应该在文本中使用“>”(ASCII 十进制 62)而不是“>”,以避免旧用户代理将其错误地视为标签的结束(标记关闭定界符)出现在引号括起来的属性值中时。
作者应该使用“&”(ASCII 十进制 38)而不是“&”,以避免与字符引用(实体引用开放定界符)的开头混淆。由于CDATA属性值中允许使用字符引用,因此作者还应在属性值中使用“&”。
一些作者使用字符实体引用“"”来编码双引号标记(
"
),因为该字符可能用于分隔属性值。
HTML在规则方面更加灵活,但听起来我应该:
<
应该改为<
>
应该改为>
&
应该改为&
"
应该改为"
如果"
可以是实体引用,则还应将'
替换为&
。
更新二
来自HTML5 - 用于HTML和XHTML的词汇表和相关API:
8.3序列化HTML片段
转义字符串(为了上述算法)包括执行以下步骤:
将任何"
&
"字符的出现替换为字符串"&
"。将U+00A0 NO-BREAK SPACE字符的任何出现替换为字符串"
"。如果在属性模式下调用算法,请将"
"
"字符的任何出现替换为字符串""
"。如果未在属性模式下调用算法,请将"
<
"字符的任何出现替换为字符串"<
",并将">
"字符的任何出现替换为字符串">
"。
我理解为HTML:
&
被替换为&
,始终如此被替换为
,始终如此"
如果在属性内部,则被替换为"
<
如果不在属性中(即属性可以包含<
),则被替换为<
>
如果不在属性中(即属性可以包含>
),则被替换为>
>
(在属性中还是不在属性中)方面提出了相反的观点,这很奇怪。 - LarsH