36

我的网站是 XHTML Transitional 兼容的,除了一件事:URL 中的 &(和号)按原样编写,而不是&

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

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

但是XHTML 验证器会产生这个错误:

无法为一般实体“y”生成系统标识符

...它希望 URL 写成这样:

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

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

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

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

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

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

5 回答 5

57

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

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

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

于 2008-11-08T21:48:49.660 回答
6

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

正如您所说,通常&amp浏览器会正确处理 URL 内部。

于 2008-11-08T23:28:31.627 回答
5

您可以在页面内的 URL 中使用&amp;而不是。&

这应该允许它被验证为严格的 XHTML ......

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

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

/mypath/mypage?b=%26stuff

因此,您需要提供一个将“&”转换为 %26 的函数。

注意:在这种情况下,会产生 neetu+%26+geetu 的Server.URLEncode("neetu & geetu")不是您想要的,因为您需要将 & 转换为 %26,而不仅仅是 '&'。您必须添加一个应用于 URLEncode 结果的 replace() 调用,才能替换 '%26amp;' 通过'%26'。

于 2008-11-08T20:30:19.663 回答
0

更彻底:使用&#38;,数字字符引用

因为&amp;字符实体引用

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

这来自 W3C 的智者(阅读本文了解更多信息)。

当然,这不是什么大问题,但 W3C 的建议是,数字的数字将在任何地方且始终有效和可用,而命名的数字对于 HTML 来说是“好的”,仅此而已。

于 2014-09-25T19:00:30.373 回答
-4

问题比您想象的要严重 - 在Safari中尝试一下。 &amp;amp;被转换为&amp;#38;并且哈希结束 URL。

正确的答案是不输出 XHTML - 没有理由证明花更多时间在开发上和疏远 Mac 用户是合理的。

于 2008-11-11T09:20:13.897 回答