我在<a href...="">?</a>编码&符号吗?

时间:2010-09-14 01:36:43

标签: html

我正在编写自动生成HTML的代码,我希望它能正确编码。

假设我正在生成指向以下网址的链接:

http://www.google.com/search?rls=en&q=stack+overflow

我假设所有属性值都应该是HTML编码的。 (如果我错了,请纠正我。)这意味着如果我将上述URL放入锚标签,我应该将&符号编码为&amp;,如下所示:

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow">

这是对的吗?

4 个答案:

答案 0 :(得分:170)

是的,确实如此。 HTML实体在HTML属性中进行解析,而迷路&会产生歧义。这就是为什么你应该总是在所有 HTML属性中写&amp;而不只是&

也就是说,只有&和引号需要进行编码。如果您的属性中有é之类的特殊字符,则无需对其进行编码即可满足HTML解析器的需要。

过去,URL需要使用非ASCII字符进行特殊处理,例如é。您必须使用percent-escape编码那些,在这种情况下,它将提供%C3%A9,因为它们由RFC 1738定义。但是,RFC 1738已被RFC 3986(URI,统一资源标识符)和RFC 3987(IRI,国际化资源标识符)取代,WhatWG based its work to define how browsers should behave when they see an URL with non-ASCII characters in it since HTML5。因此,现在可以安全地在URL中包含非ASCII字符,百分比编码或不编码。

答案 1 :(得分:24)

根据当前的官方HTML建议,必须对&符号进行转义,例如在这样的上下文中为&amp;。但是,浏览器不需要它,HTML5 CR建议将其设为rule,以便特殊规则适用于属性值。目前的HTML5验证器在这方面已经过时(请参阅bug report并附注释)。

仍然可以在属性值中转义&符号,但除了使用当前工具验证之外,没有实际需要在href值中转义它们(如果你开始犯错误的风险很小)逃避他们)。

答案 2 :(得分:3)

是的,您应该将&转换为&amp;

This html validator tool by W3C对此类问题很有帮助。它会告诉您特定页面的错误和警告。

答案 3 :(得分:2)

我正在发布新答案,因为我发现zneak的答案没有足够的示例,没有将HTML和URI处理显示为不同的方面和标准,并且缺少一些小东西。

关于链接(<a href)中的URL,您有两个标准。

第一个标准是RFC 1866(HTML 2.0),其中在“ 3.2.1。数据字符”中,您可以读取用作HTML属性值时需要转义的字符。 (属性本身根本不允许使用特殊字符,例如,不允许<a hr&ef="http://...,也不允许<a hr&amp;ef="http://...。)

此后进入了HTML 4标准,您需要转义的字符是:

<   to   &lt;
>   to   &gt;
&   to   &amp;
"   to   &quote;
'   to   &apos;

另一个标准是RFC 3986“通用URI标准”,用于处理URL(这种情况发生在浏览器由于用户单击HTML元素而要跟随链接时)。

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

对这些字符进行转义很重要,这样客户端才能知道它们代表数据还是定界符。

未转义的示例:

https://example.com/?user=test&password&te&st&goto=https://google.com

示例,完整合法的网址

https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com

HTML属性值中的完整合法URL示例:

https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com

其他重要情况:

  • JavaScript作为值:

    <img src="..." onclick="window.location.href = &quot;https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com&quot;;">...</a>(是,;;是正确的。)

  • JSON作为值:

    <a href="..." data-analytics="{&quot;event&quot;: &quot;click&quot;}">...</a>

  • 转义字符内的转义字符,双重编码,参数内URL内的URL等...

    http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&amp;password=&quot;&quot;123