&符号(&)旁边的其他字符应该在HTML href / src属性中编码?

时间:2011-09-17 16:48:07

标签: html href url-encoding

“&”是唯一应该在HTML属性中编码的字符吗?

众所周知,这不会通过验证:

<a href="http://domain.com/search?q=whatever&lang=en"></a>

因为&符号应为&amp;。这是验证失败的direct link

应编码的

This guy lists a bunch of characters,但他错了。如果您对http://中的第一个“/”进行编码,则href将无效。

在ASP.NET中,是否已经构建了一个帮助方法来处理这个问题?像Server.UrlEncode和HtmlEncode这样的东西显然不起作用 - 这些用于不同的目的。

我可以构建我自己的简单扩展方法(如.ToAttributeView()),它可以进行简单的字符串替换。

5 个答案:

答案 0 :(得分:9)

除了值的标准URI编码之外,&amp;是唯一与HTML实体相关的字符,您只需要担心,因为这是开始每个HTML实体的字符。以下面的URL为例:

http://query.com/?q=foo&lt=bar&gt=baz

即使没有尾随的分号,因为&amp; lt;是&lt;的实体和&amp; gt;是&gt;的实体,一些旧浏览器会将此网址翻译为:

http://query.com/?q=foo<=bar>=baz

所以你需要指定&amp;作为&amp; amp;防止HTML解析文档中的链接发生这种情况。

答案 1 :(得分:1)

转义字符的目的是不将它们作为参数处理。所以你实际上不想编码整个url,只是你通过查询字符串传递的值。例如:

http://example.com/?parameter1=<ENCODED VALUE>&parameter2=<ENCODED VALUE>

您展示的网址实际上是一个完全有效的网址,可以通过验证。但是,浏览器会将&符号解释为查询字符串中参数之间的中断。所以你的查询字符串:

?q=whatever&lang=en

接收者实际上会将其翻译为两个参数:

q = "whatever"
lang = "en"

要让您的网址正常工作,您只需要确保您的值正在编码:

?q=<ENCODED VALUE>&lang=<ENCODED VALUE>

编辑:您链接到的W3C的常见问题页面是关于在html中呈现网址时的边缘情况,而&后面是可以解释为实体引用(例如&copy)。这是jsfiddle中的一个测试,显示了url:

http://jsfiddle.net/YjPHA/1/

在Chrome和FireFox中,链接正常工作,但IE将&copy呈现为©,从而破坏了链接。我不得不承认我在野外从未遇到过这个问题(它只会影响那些不需要分号的实体引用,这是一个非常小的子集)。

为了确保您免受此错误的影响,您可以对您呈现给网页的任何网址进行HTML编码,您应该没问题。如果您使用的是ASP.NET,HttpUtility.HtmlEncode方法应该可以正常工作。

答案 2 :(得分:1)

您不需要HTML擒纵机构:

<a href="http://domain.com/search?q=whatever&lang=en"></a>

根据HTML5规范: http://www.w3.org/TR/html5/tokenization.html#character-reference-in-attribute-value-state

应将

&lang=解析为不可识别的字符引用,并应按原样使用该属性的值:http://domain.com/search?q=whatever&lang=en

供参考:已向HTML5工作组添加问题:http://lists.w3.org/Archives/Public/public-html/2011Sep/0163.html

答案 3 :(得分:1)

在HTML属性值中,如果您想要“,”&amp;'作为结果的不间断空格,你应该(作为明确意图的作者)在标记中有&amp; quot;,&amp; amp;和&amp; nbsp;。

对于“但是,如果使用单引号来包含属性值,则不必使用&amp; quot;”

对于HTML文本节点,除上述内容外,如果需要&lt;和&gt;作为结果,您应该使用&amp; lt;和&amp; gt;。 (我甚至也在属性值中使用它们。)

对于URI的hfnames和hfvalues(以及路径中的目录名称),我使用了Javascript的encodeURIComponent()(在utf-8页面上进行编码时在utf-8页面上)。

答案 4 :(得分:0)

如果我正确理解了这个问题,我相信this就是你想要的。