【问题标题】:Do ampersands still need to be encoded in URLs in HTML5?在 HTML5 的 URL 中还需要对 & 符号进行编码吗?
【发布时间】:2013-10-18 04:45:13
【问题描述】:

我最近(来自thesequestions)了解到,在某些时候建议在 href 参数中编码与符号。也就是说,而不是写:

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

应该写:

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

显然,前一个示例不应该工作,但浏览器错误恢复意味着它可以工作。

HTML5 还是这样吗?

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

【问题讨论】:

标签: html url-encoding


【解决方案1】:

引自W3C Differences Page,确实HTML5和HTML4的区别之一是:

与 HTML4 相比,与号 (&) 在更多情况下可能不转义。

事实上,HTML5 规范不遗余力地描述了确定使用(和解释)字符意味着什么的实际算法。

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

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

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

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

你有字符序列

  • 与号
  • 拉丁文小写字母 Y
  • 等号

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

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

那里没有分号,所以没有解析错误。

现在假设你有,而不是,

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

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

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

所以= 使它成为一个错误,因为旧版浏览器可能会混淆。

尽管 HTML5 规范似乎不遗余力地表示“这个 & 符号不是开始字符实体引用,所以这里没有引用”,但您可能会遇到具有命名引用的 URL(例如,@ 987654335@, part, sum, sub) 这会导致解析错误,那么恕我直言,你最好使用它们。不过当然,你只问属性上的限制有没有放宽,而不是应该怎么做,看来确实放宽了。

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

【讨论】:

  • 谢谢!这是一个非常全面的答案,超出了我的预期,感谢您为此付出的努力。
  • 没问题。顺便说一句,这里有一个很好的小描述,说明为什么你的例子是好的;它从 明确的 & 符号 的概念来看待事物:mathiasbynens.be/notes/ambiguous-ampersands。该页面上还有一个指向 & 号感知验证器的链接。是的,它表明x=1&amp;y=2 很好,但x=1&amp;copy=2 不是。
猜你喜欢
  • 2011-05-12
  • 2014-07-14
  • 2011-01-10
  • 1970-01-01
  • 2014-10-03
  • 2012-04-07
  • 2010-10-31
  • 1970-01-01
  • 2018-10-10
相关资源
最近更新 更多