"&安培;朗"在URL中误解释

时间:2014-05-12 10:59:06

标签: javascript php html browser anchor

我正在开发 javascript禁用手机。我的代码看起来像这样

<a href="someurl?var=a&lang=english">Link 1</a>
<a href="someurl?lang=english&var=a">Link 2</a>

但是浏览器将URL解释为 -

someurl?var=a%e2%8c%a9=english         (Link 1, incorrect)
someurl?lang=english&var=a             (Link 2 works just fine !)

似乎&lang=english正在转换为a%e2%8c%a9=english

有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:7)

在HTML中,&字符表示字符引用的开头。

如果您尝试指定无效的字符引用,则浏览器将执行错误恢复并将其视为&符号。

来自HTML DTD:

<!ENTITY lang     CDATA "&#9001;" -- left-pointing angle bracket = bra,
                                 U+2329 ISOtech -->

...所以&lang不是无效的字符引用。

要将&符号作为数据包含,请使用&符号的字符参考:&amp;

答案 1 :(得分:4)

HTML 4.01 rules&lang实体引用表示字符U + 2329 LEFT-POINTING ANGLE BRACKET“<”。在UTF-8编码中,该字符表示为0xE2 0x8C 0xA9,因此在URL中,它被%{编码为a%e2%8c%a9

如今,大多数浏览器都不会这样工作。具体来说,在URL中,当后跟等号&lang时,无法识别引用=(即使在该上下文中它是有效的HTML 4.01)。

要处理可能遵循旧规则的浏览器,以及为了遵守HTML版本的语法规则,请将&符号“&amp;”的每次出现转义为&amp; - 最安全的对所有出现的“&amp;”作为数据字符,在属性值和其他地方执行此操作。

根据在遵循URL时处理URL的服务器端软件,您可以使用像“;”这样的无问题字符而不是“&amp;”作为分隔符。

答案 2 :(得分:3)

http://www.htmlhelp.com/tools/validator/problems.html#amp(由http://validator.w3.org/docs/help.html的w3链接)解释了它。

&标志着所谓entity的开始。实体例如是&euro;(€),&lt;(&lt;),..

如果您现在输入了URL &lang,则会在任何验证程序中引发错误,因为它不是有效的实体。然后浏览器会转发此序列。

解决方案:

您必须通过自己的实体&转义&amp;,因此网址如下所示:

<a href="someurl?var=a&amp;lang=english">Link 1</a>
相关问题