哪些是HTML和XML特殊字符?

Ian*_*oyd 26 xml http special-characters entityreference htmlspecialchars

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;"来编码双引号mark(")的实例,因为该字符可用于分隔属性值.

HTML在规则上更加多愁善感,但听起来我应该:

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

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


更新二

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

8.3序列化HTML片段

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

&字符串" &amp;" 替换任何出现的" "字符.

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

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

如果该算法未在属性模式调用,替换"的任何事件<"被串字符" &lt;",和"的任何事件>"被串字符" &gt;".

我读作HTML:

  • &通过&amp;始终
  •  通过&nbsp;始终
  • "通过&quot;如果它是一个属性中
  • <通过&lt;如果它不是在一个属性(即属性可以包含<)
  • >通过&gt;如果它不是在一个属性(即属性可以包含>)

joh*_*tke 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>)

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

因此,唯一的争论点是 (space). The only mention of it in either specification is when serialization is attempted. When not, you should always use a literal (空格).除非您正在编写自己的解析器,否则我认为不需要进行任何类型的序列化,因此这不是重点.

  • 没有理由逃避`>`,除非在XML线性化的数据中非常特殊且非常罕见的`]]>`.如果需要,它可以*被转义为对称性(转义为`<`).这就是参考文献实际说的内容.当相同的字符用作属性值分隔符时,除了属性值之外没有理由逃避`'`或```. (2认同)