首页 文章

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

提问于
浏览
19

HTML 4状态相当which characters应该被转义:

四个字符实体引用值得特别提及,因为它们经常用于转义特殊字符:“&lt;”代表<符号 . “&gt;” 中代表>符号 . “&安培;”代表&符号 . “”代表“标记 . 希望在文本中加入“<”字符的作者应使用“&lt;” (ASCII十进制60)以避免可能与标记的开头混淆(开始标记打开分隔符) . 同样,作者应使用“&gt;” (ASCII十进制62)在文本而不是“>”中,以避免旧的用户代理在出现在引用的属性值中时错误地将其视为标记的末尾(标记关闭分隔符)的问题 . 作者应该使用“&amp;” (ASCII十进制38)而不是“&”以避免与字符引用(实体引用打开分隔符)的开头混淆 . 作者也应该使用“&amp;”在属性值中,因为在CDATA属性值中允许字符引用 . 一些作者使用字符实体引用“”“编码双引号(“)的实例,因为该字符可用于分隔属性值 .

我在HTML 5中找到了类似的东西 . 在grep的帮助下,我能找到的唯一非XML提及是关于_85150的:

改用pre和code,并将“<”和“&”字符转义为“&lt;”和“&amp;”分别 .

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

3 回答

  • 3

    specification defines the syntax for normal elements为:

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

    所以当你跟着anything that could begin a character reference时你必须逃避 <& . 关于&符号的规则是引用属性的唯一规则,因为匹配的引号是唯一终止一个的引号 . (显然,如果您不想在那里终止属性值,请转义引号 . )

    这些规则不适用于 <script><style> ;你应该避免在其中加入动态内容 . (如果必须在 <script> 中包含JSON,请将 < 替换为 \x3c ,将U 2028字符替换为 \u2028 ,将U 2029替换为 \u2029 ,以后进行JSON序列化 . )

  • 4

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

    转义字符串(出于上述算法*的目的)包括运行以下步骤:用字符串“&amp;”替换任何出现的“&”字符 . 将任何出现的U 00A0 NO-BREAK SPACE字符替换为字符串“&nbsp;” . 如果在属性模式下调用算法,则用字符串“&quot;”替换任何出现的“”字符 . 如果在属性模式中未调用算法,则用字符串替换“<”字符的任何出现“&lt;”,以及字符串“&gt;”出现的“>”字符 .

    *算法是内置的序列化算法,例如被称为由 innerHTML getter .

    严格地说,这不是你的问题的一个问题,因为它处理序列化而不是解析 . 但另一方面,序列化输出旨在安全地解析 . 因此,通过暗示,在编写标记时:

    • & 字符应替换为 &amp;

    • 不间断的空格应该被转义为 &nbsp; (惊喜!......)

    • 在属性中, " 应该被转义为 &quot;

    • 属性之外, < 应该被转义为 &lt;> 应该被转义为 &gt;

    我故意写“应该”而不是“必须”,因为解析器可以纠正违反上述内容的行为 .

  • 6

    加上我的声音,坚持说事情并不那么容易 - 严格来说:

    案例1:HTML序列化

    (最普遍的)

    如果您将HTML5序列化为HTML,"the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand."

    一个模棱两角的&符是"ampersand followed by one or more alphanumeric ASCII characters, followed by a U+003B SEMICOLON character (;)"

    此外,"the parsing of certain named character references in attributes happens even with the closing semicolon being omitted."

    因此,在这种情况下 editable && copy (注意&&周围的空格)是有效的HTML5序列化为HTML构造,因为没有一个&符后跟一个字母 .

    作为一个反例: editable&&copy 不安全(即使这可能有效),因为最后一个序列 &copy 可能被解释为 © 的实体引用

    案例1:XML序列化

    (不太常见)

    这里适用经典的XML规则 . 例如,文本或属性中的每个&符号都应转义为 &amp; .

    在这种情况下, && (带或不带空格)是无效的XML . 你应该写 &amp;&amp;

    整蛊,不是吗?

相关问题