我正在编写自动生成HTML的代码,我希望它能正确编码。
假设我正在生成指向以下网址的链接:
http://www.google.com/search?rls=en&q=stack+overflow
我假设所有属性值都应该是HTML编码的。 (如果我错了,请纠正我。)这意味着如果我将上述URL放入锚标签,我应该将&符号编码为&
,如下所示:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
这是对的吗?
答案 0 :(得分:170)
是的,确实如此。 HTML实体在HTML属性中进行解析,而迷路&
会产生歧义。这就是为什么你应该总是在所有 HTML属性中写&
而不只是&
。
也就是说,只有&
和引号需要进行编码。如果您的属性中有é
之类的特殊字符,则无需对其进行编码即可满足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建议,必须对&符号进行转义,例如在这样的上下文中为&
。但是,浏览器不需要它,HTML5 CR建议将其设为rule,以便特殊规则适用于属性值。目前的HTML5验证器在这方面已经过时(请参阅bug report并附注释)。
仍然可以在属性值中转义&符号,但除了使用当前工具验证之外,没有实际需要在href
值中转义它们(如果你开始犯错误的风险很小)逃避他们)。
答案 2 :(得分:3)
是的,您应该将&
转换为&
。
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&ef="http://...
。)
此后进入了HTML 4标准,您需要转义的字符是:
< to <
> to >
& to &
" to "e;
' to '
另一个标准是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&password&te%26st&goto=https%3A%2F%2Fgoogle.com
其他重要情况:
JavaScript作为值:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(是,;;
是正确的。)
JSON作为值:
<a href="..." data-analytics="{"event": "click"}">...</a>
转义字符内的转义字符,双重编码,参数内URL内的URL等...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123