关于html:我是否在中对&符号进行编码?

Do I encode ampersands in ?

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

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

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

我假设所有属性值都应进行HTML编码。 (如果我写错了,请纠正我。)这意味着,如果将上述URL放入锚标记中,则应将&编码为&,如下所示:

1
 

那是对的吗?


是的。 HTML实体在HTML属性中进行了解析,并且流浪&会造成歧义。这就是为什么您应该始终在所有HTML属性中编写&而不是仅仅写&的原因。

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

过去,URL需要使用非ASCII字符(例如é)进行特殊处理。您必须使用百分比转义对它们进行编码,在这种情况下,它将给出%C3%A9,因为它们是由RFC 1738定义的。但是,RFC 1738已由RFC 3986(URI,统一资源标识符)和RFC 3987( IRI,国际化资源标识符),WhatWG以此为基础来定义浏览器在看到自HTML5以来包含非ASCII字符的URL时的行为。因此,现在可以安全地在URL中包含非ASCII字符,无论是否经过百分比编码。


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

仍然可以转义属性值中的"&"号,但是除了使用当前工具进行验证外,实际上没有必要在href值中对它们进行转义(如果开始转义,则存在犯错误的小风险)。


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

您有两个关于链接中URL的标准().

The first standard is RFC 1866 (HTML 2.0) where in"3.2.1. Data Characters" you can read the characters which need to be escaped when used as the value for an HTML attribute. (Attributes themselves do not allow special characters at all, e.g. is not allowed, nor is .)

Later this has gone into the HTML 4 standard, the characters you need to escape are:

The other standard is RFC 3986"Generic URI standard", where URLs are handled (this happens when the browser is about to follow a link because the user clicked on the HTML element).

It is important to escape those characters so the client knows wether they represent data or a delimiter.

Example unescaped:

Example, fully legit URL

Example fully legit URL in value of HTML attribute:

Also important scenarios:

  • Javascript as a value:

    ...(是,;;是正确的。)

  • JSON作为值:

    ...

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

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


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

W3C的这个html验证器工具对于此类问题很有帮助。它将告诉您特定页面的错误和警告。