我正在编写自动生成HTML的代码,我希望它能正确编码.
假设我正在生成指向以下网址的链接:
http://www.google.com/search?rls=en&q=stack+overflow
Run Code Online (Sandbox Code Playgroud)
我假设所有属性值都应该是HTML编码的.(如果我错了,请纠正我.)这意味着如果我将上面的URL放入锚标签,我应该将&符编码为&,如下所示:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Run Code Online (Sandbox Code Playgroud)
那是对的吗?
zne*_*eak 171
是的.HTML实体在HTML属性中被解析,并且迷路&会产生歧义.这就是为什么你应该总是写,&而不是只是&在所有 HTML属性中.
也就是说,只需要编码&引号.如果您的属性中包含特殊字符,则无需对其进行编码即可满足HTML解析器的要求.é
过去,URL需要使用非ASCII字符进行特殊处理,例如é.你必须使用percent-escape编码那些,在这种情况下它会给出%C3%A9,因为它们是由RFC 1738定义的.但是,RFC 1738已被RFC 3986(URI,统一资源标识符)和RFC 3987(IRI,国际化资源标识符)取代,WhatWG基于其工作来定义浏览器在看到非ASCII的URL时的行为方式HTML5以来的字符.因此,现在可以安全地在URL中包含非ASCII字符,百分比编码或不编码.
Juk*_*ela 24
根据当前的官方HTML建议,必须对&符号进行转义,例如&像这样的上下文.但是,浏览器不需要它,HTML5 CR建议将此作为规则,以便特殊规则适用于属性值.当前的HTML5验证器在这方面已经过时(请参阅带有注释的错误报告).
仍然可以在属性值中转义&符号,但除了使用当前工具进行验证之外,没有实际需要在href值中转义它们(如果您开始转义它们,则存在发生错误的小风险).
我发布了一个新答案,因为我发现 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 '
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&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Run Code Online (Sandbox Code Playgroud)
同样重要的场景:
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
| 归档时间: |
|
| 查看次数: |
52062 次 |
| 最近记录: |