我在<a href...>中编码&符号吗?

JW.*_*JW. 154 html

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

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

http://www.google.com/search?rls=en&q=stack+overflow
Run Code Online (Sandbox Code Playgroud)

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

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow">
Run Code Online (Sandbox Code Playgroud)

那是对的吗?

zne*_*eak 171

是的.HTML实体在HTML属性中被解析,并且迷路&会产生歧义.这就是为什么你应该总是写,&amp;而不是只是&所有 HTML属性中.

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

过去,URL需要使用非ASCII字符进行特殊处理,例如é.你必须使用percent-escape编码那些,在这种情况下它会给出%C3%A9,因为它们是由RFC 1738定义的.但是,RFC 1738已被RFC 3986(URI,统一资源标识符)和RFC 3987(IRI,国际化资源标识符)取代,WhatWG基于其工作来定义浏览器在看到非ASCII的URL时的行为方式HTML5以来的字符.因此,现在可以安全地在URL中包含非ASCII字符,百分比编码或不编码.

  • 我会添加(因为我刚陷入这个错误),如果你依赖于**模板引擎**,你应该检查是否需要自动处理转义的HTML实体.在我的情况下_Twig_正在这样做,我错误地将`&amp;`写入标签属性,而不是直接使用`&`. (4认同)
  • 您还可以将空格编码为“+”而不是 %20 - 这使得 URL 更易于阅读。 (2认同)
  • + 目前在本机 iPhone 邮件客户端的 mailto 链接中不受尊重,这是值得的。 (2认同)

Juk*_*ela 24

根据当前的官方HTML建议,必须对&符号进行转义,例如&amp;像这样的上下文.但是,浏览器不需要它,HTML5 CR建议将此作为规则,以便特殊规则适用于属性值.当前的HTML5验证器在这方面已经过时(请参阅带有注释的错误报告).

仍然可以在属性值中转义&符号,但除了使用当前工具进行验证之外,没有实际需要在href值中转义它们(如果您开始转义它们,则存在发生错误的小风险).

  • 但是,XHTML(*real*XHTML作为`application/xhtml + xml`发送)很可能总是需要它. (4认同)
  • 对于这种变化的一个警告,仍然在讨论,辩论和误解,是'&`现在应该是好的,只要它是"**un**ambiguous".使&符号含糊不清的一个显而易见的方法是首先使用非空格字符然后使用分号.那个&符号现在是模糊的,**将导致解析错误. (4认同)

Dan*_* W. 6

我发布了一个新答案,因为我发现 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;
Run Code Online (Sandbox Code Playgroud)

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

reserved    = gen-delims / sub-delims

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

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

转义这些字符很重要,这样客户端才能知道它们是代表数据还是分隔符。

未转义示例:

https://example.com/?user=test&password&te&st&goto=https://google.com
Run Code Online (Sandbox Code Playgroud)

示例,完全合法的 URL

https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Run Code Online (Sandbox Code Playgroud)

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

https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com
Run Code Online (Sandbox Code Playgroud)

同样重要的场景:

  • 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