是否仍然需要在HTML5中的URL中编码&符号?

时间:2013-10-18 04:45:14

标签: html5 url-encoding

我最近(从these questions)了解到,在某些时候,建议在 href 参数中编码&符号。也就是说,而不是写作:

<a href="somepage.html?x=1&y=2">...</a>

应该写一下:

<a href="somepage.html?x=1&amp;y=2">...</a>

显然,前一个示例不起作用,但浏览器错误恢复意味着它。

在HTML5中仍然如此吗?

我们现在已经过了严苛的XHTML要求时代。这是XHTML严格处理的要求,还是我作为Web开发人员应该注意的事情呢?

1 个答案:

答案 0 :(得分:33)

W3C Differences Page引用的HTML5和HTML4之间的区别之一是:

  

与HTML4相比,&符号(&amp;)可以在更多情况下保留未转义状态。

事实上,HTML5规范非常详细地描述了确定消费(和解释)字符意味着什么的实际算法。

特别是,在HTML5规范第8章的section on tokenizing character references中,我们看到当你在一个属性中时,你会看到一个&符号后面跟着:

  • 标签,LF,FF,空格,<&,EOF或其他允许的字符(如果引用属性值,则为"'>如果没有)===&gt;那么&符只是一个&符号,不用担心;
  • 数字符号===&gt;然后HTML5标记生成器将通过许多步骤来确定它是否具有数字字符实体引用,但请注意,在这种情况下,一个是解析错误(请阅读规范)
  • 任何其他角色===&gt;解析器将尝试查找命名的字符引用,例如&notin;

最后一个案例是您感兴趣的案例,因为您的例子有:

<a href="somepage.html?x=1&y=2">...</a>

你有字符序列

  • AMPERSAND
  • LATIN SMALL LETTER Y
  • EQUAL SIGN

现在,这是HTML5规范中与您的案例相关的部分,因为y不是命名实体引用:

  

如果不能匹配,则不会消耗任何字符,也不会返回任何内容。在这种情况下,如果U + 0026 AMPERSAND字符(&amp;)之后的字符由一个或多个字母数字ASCII字符后跟一个U + 003B SEMICOLON字符(;)组成,则这是一个解析错误。

那里没有分号,因此您没有解析错误。

现在假设你有,

<a href="somepage.html?x=1&eacute=2">...</a>

这是不同的,因为&eacute; 是HTML中的命名实体引用。在这种情况下,以下规则开始:

  

如果字符引用正在作为属性的一部分使用,并且匹配的最后一个字符不是“;” (U + 003B)字符,下一个字符是“=”(U + 003D)字符或字母数字ASCII字符,然后,由于历史原因,所有在U + 0026 AMPERSAND字符后匹配的字符(&amp; ;)必须是未消耗的,并且不返回任何内容。但是,如果下一个字符实际上是“=”(U + 003D)字符,那么这是一个解析错误,因为在这些情况下,某些旧版用户代理会误解标记。

因此,=会导致错误,因为旧版浏览器可能会感到困惑。

尽管HTML5规范似乎不遗余力地说“好吧这个&符号没有开始一个字符实体引用所以这里没有引用”这个事实你可能会遇到具有命名引用的URL(例如{导致解析错误的{1}},isinpartsum),然后恕我直言,你最好用它们。但是,当然,你只询问限制是否放宽了属性,而不是你应该做什么,看起来它们确实存在。

看看验证器可以做什么会很有趣。