必须在HTML 5中转义哪些字符?

eze*_*zon 20 html html5 escaping html-escape-characters

HTML 4说明应该转义哪些字符:

四个字符实体引用值得特别提及,因为它们经常用于转义特殊字符:

  • "<" 代表<符号.
  • ">" 中 代表>符号.
  • "&安培;" 代表&符号.
  • ""代表"标记".

希望在文本中加入"<"字符的作者应使用"<" (ASCII十进制60)以避免可能与标记的开头混淆(开始标记打开分隔符).同样,作者应该使用">" (ASCII十进制62)在文本而不是">"中,以避免旧的用户代理在出现在带引号的属性值中时错误地将其视为标记的末尾(标记关闭分隔符)时出现问题.

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

一些作者使用字符实体引用""" 编码双引号(")的实例,因为该字符可用于分隔属性值.

我很惊讶我在HTML 5中找不到这样的东西.在grep的帮助下,我可以找到的唯一非XML提及是关于已弃用的XMP元素:

请改用pre和code,并将"<"和"&"字符转义为"<" 和"&" 分别.

可以在某种程度上指出这件事的官方消息来源吗?

Ry-*_*Ry- 8

规范定义了正常元素的语法为:

普通元素可以包含文本,字符引用,其他元素和注释,但文本不得包含字符U + 003C LESS-THAN SIGN(<)或不明确的&符号.除了内容模型和本段所述的限制之外,一些正常元素对允许它们容纳的内容还有更多限制.这些限制如下所述.

所以你必须逃避<,或者&任何可以开始角色引用的东西后面.关于&符号的规则是引用属性的唯一规则,因为匹配引号是唯一终止一个的引号.(显然,如果您不想在那里终止属性值,请转义引号.)

这些规则不适用于<script><style>; 你应该避免在其中加入动态内容.(如果您包括JSON的<script>,替换<\x3c的U + 2028字符与\u2028和U + 2029与\u2029JSON序列化后).

  • @eze:见 http://www.w3.org/html/wg/drafts/html/master/single-page.html#syntax-errors;*“然而,在下面的片段中,属性的值实际上是“?art©”,而不是预期的“?art©”,因为即使没有最后的分号,“©”的处理方式与“©”相同 因此被解释为“©”:”*。再次,历史原因。=/ (2认同)
  • 这适用于HTML5的HTML序列化.在HTML5的XHTML序列化中,所有XML规则都适用,因此必须始终对"&"进行转义. (2认同)

use*_*621 5

来自http://www.w3.org/html/wg/drafts/html/master/single-page.html#serializing-html-fragments

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

  1. 用字符串“&”替换任何出现的“&”字符。
  2. 用字符串“ ”替换任何出现的 U+00A0 NO-BREAK SPACE 字符。
  3. 如果算法是在属性模式下调用的,则用字符串“””替换任何出现的“””字符。
  4. 如果算法不是在属性模式下调用的,则将任何出现的“<”字符替换为字符串“<”,将任何出现的“>”字符替换为字符串“>”。

* Algorithm是内置的序列化算法,例如由innerHTMLgetter调用。

严格来说,这并不完全是对您问题的回答,因为它涉及序列化而不是解析。但另一方面,序列化的输出被设计为可安全解析。因此,暗示,在编写标记时:

  1. &字符应替换为&amp;
  2. 不间断空格应该被转义为&nbsp;(惊喜!...)
  3. 在属性内,"应该转义为&quot;
  4. 在属性之外,<应该被转义为&lt;并且>应该被转义为&gt;

我故意写“应该”,而不是“必须”,因为解析器可能能够纠正上述违规行为。