XHTML和& (&符号)编码

时间:2008-11-08 20:27:53

标签: url urlencode xhtml

我的网站符合XHTML Transitional标准除了一件事:& URL中的(&符号)按原样编写,而不是&

也就是说,我页面中的所有网址都是这样的:

<a href="http://www.foo.com/page.aspx?x=1&y=2">Foo</a>

XHTML validator会产生此错误:

  

无法为通用实体“y”生成系统标识符

...它希望网址写成:

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

问题是IE和Firefox无法正确处理URL并忽略y参数。 如何使此链接正常工作并正确验证?

在我看来,如果浏览器不能使用严格编码的XHTML URL,则无法编写XHTML页面。

你想看到行动吗?查看这两个链接之间的区别(按原样复制和粘贴它们):

http://stackoverflow.com/search?q=ff&sort=newest

http://stackoverflow.com/search?q=ff&amp;sort=newest

5 个答案:

答案 0 :(得分:56)

我刚试过这个。你试图做的是正确的。在HTML中,如果您正在撰写链接,则&字符应编码为&amp;如果您希望参数值包含&符号,则只能将&编码为%26 。我刚写了一个包含链接的简单HTML页面:<a href="Default2.aspx?param1=63&amp;param2=hel">Click me</a> 并且它工作正常:default2.aspx收到了预期的参数,并且源通过了验证。

HTML中需要将&编码为&amp;,而不是链接。当浏览器在HTML源代码中看到&amp;链接时,它会将其解释为&符号,链接目标将按预期方式进行。如果您将URL粘贴到浏览器地址栏中,则不希望它是HTML,也不会尝试解释它可能包含的任何HTML编码。这就是为什么您建议我们应该复制/粘贴到浏览器中的示例链接不起作用以及为什么我们不希望它们起作用。

如果你发布了更多的实际代码,我们可能会看到你做错了什么,但是你似乎在锚标签中使用&amp;朝着正确的方向前进。

答案 1 :(得分:6)

这是我的错:超链接控件已编码&amp;,所以我的网址http://foo?x=1&amp;y=2已编码为http://foo?x=1&amp;amp;y=2

正如您所说,通常浏览器会正确处理网址内的&amp; amp。感谢

答案 2 :(得分:5)

您可以使用&amp;代替&amp;在您网页的网址中。

这应该允许它验证严格的xhtml ...

<a href="http://www.foo.com/page.aspx?x=1&amp;y=2">Foo</a>

注意,如果由ASP.NET Request.QueryString函数使用,查询字符串不使用XML编码,则使用URL encoding

/mypath/mypage?b=%26stuff

所以你需要提供一个翻译'&amp;'的功能进入%26

注意:在这种情况下,生成neetu +%26 + geetu的Server.URLEncode(“neetu&amp; geetu”)不是你想要的,因为你需要翻译&amp;进入%26,而不仅仅是'&amp;'。您必须添加应用于URLEncode结果的replace()调用,以替换'%26amp;' '%26'。

答案 3 :(得分:-1)

更全面:使用&#38;数字字符引用

因为&amp;字符实体引用

  

字符实体引用在标记语言中定义   定义。这意味着,例如,对于HTML只是一个特定的   字符范围(由HTML规范定义)可以   表示为字符实体引用(并且仅包含一个   Unicode范围的一小部分。)

这些来自W3C的聪明人(请阅读this了解更多信息)。

当然,这不是什么大问题,但是W3C的建议是,数字版本将是有效的,并且可以在任何地方使用,并且总是如此,而命名的那个是“精细”的。对于HTML,但仅此而已。

答案 4 :(得分:-4)

问题比你想象的还要糟糕 - 在Safari中尝试一下。 &放大器;放大器;转换为&amp;#38;并且散列结束URL。正确的答案是不输出XHTML - 没有理由认为花更多的时间在开发上并疏远mac用户。