代码之家  ›  专栏  ›  技术社区  ›  JW.

我是否在<a href…>中编码和号?

  •  151
  • JW.  · 技术社区  · 14 年前

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

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

    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 回复  |  直到 6 年前
        1
  •  168
  •   zneak    11 年前

    是的,是的。HTML实体在HTML属性中被解析,并且 & 会造成歧义。这就是为什么你应该一直写 &amp; 而不仅仅是 & 里面 全部的 HTML属性。

    只是说 & 引文 需要 被编码。如果你有像 é 在您的属性中,您不需要对它们进行编码来满足HTML解析器。

    以前URL需要使用非ASCII字符进行特殊处理,比如 γ射线 . 你必须使用百分比转义对它们进行编码,在这种情况下,它会给出 %C3%A9 ,因为它们是由 RFC 1738 . 但是,RFC1738已被取代 RFC 3986 (URI、统一资源标识符)和 RFC 3987 (IRIS,国际化资源标识符),其中 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字符,不管是否使用百分比编码。

        2
  •  24
  •   Jukka K. Korpela    12 年前

    根据当前的官方HTML建议,必须转义和号,例如 &amp; 在这种情况下。然而,浏览器不需要它,HTML5CR建议将其作为 rule ,以便在属性值中应用特殊规则。当前的HTML5验证程序在这方面已过时(请参见 bug report 附有评论)。

    在属性值中仍然可以转义和符号,但除了使用当前工具进行验证之外,实际上不需要在 href 价值观(如果你开始逃避错误的话,犯错误的风险很小)。

        3
  •  3
  •   eebbesen user3132728    9 年前

    是的,你应该转换 & &amp; .

    This html validator tool by W3C 对于这样的问题很有帮助。它将告诉您特定页面的错误和警告。

        4
  •  2
  •   Daniel W.    6 年前

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

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

    第一个标准是 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
    

    示例,完全合法的URL

    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