“&”是唯一应该在HTML属性中编码的字符吗?
众所周知,这不会通过验证:
<a href="http://domain.com/search?q=whatever&lang=en"></a>
因为&符号应为&
。这是验证失败的direct link。
This guy lists a bunch of characters,但他错了。如果您对http://
中的第一个“/”进行编码,则href将无效。
在ASP.NET中,是否已经构建了一个帮助方法来处理这个问题?像Server.UrlEncode和HtmlEncode这样的东西显然不起作用 - 这些用于不同的目的。
我可以构建我自己的简单扩展方法(如.ToAttributeView()
),它可以进行简单的字符串替换。
答案 0 :(得分:9)
除了值的标准URI编码之外,&amp;是唯一与HTML实体相关的字符,您只需要担心,因为这是开始每个HTML实体的字符。以下面的URL为例:
http://query.com/?q=foo<=bar>=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>¶meter2=<ENCODED VALUE>
您展示的网址实际上是一个完全有效的网址,可以通过验证。但是,浏览器会将&
符号解释为查询字符串中参数之间的中断。所以你的查询字符串:
?q=whatever&lang=en
接收者实际上会将其翻译为两个参数:
q = "whatever"
lang = "en"
要让您的网址正常工作,您只需要确保您的值正在编码:
?q=<ENCODED VALUE>&lang=<ENCODED VALUE>
编辑:您链接到的W3C的常见问题页面是关于在html中呈现网址时的边缘情况,而&
后面是可以解释为实体引用(例如©
)。这是jsfiddle中的一个测试,显示了url:
在Chrome和FireFox中,链接正常工作,但IE将©
呈现为©,从而破坏了链接。我不得不承认我在野外从未遇到过这个问题(它只会影响那些不需要分号的实体引用,这是一个非常小的子集)。
为了确保您免受此错误的影响,您可以对您呈现给网页的任何网址进行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就是你想要的。