我正在开发 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
有人可以解释为什么会这样吗?
答案 0 :(得分:7)
在HTML中,&
字符表示字符引用的开头。
如果您尝试指定无效的字符引用,则浏览器将执行错误恢复并将其视为&符号。
来自HTML DTD:
<!ENTITY lang CDATA "〈" -- left-pointing angle bracket = bra,
U+2329 ISOtech -->
...所以&lang
不是无效的字符引用。
要将&符号作为数据包含,请使用&符号的字符参考:&
答案 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;”作为数据字符,在属性值和其他地方执行此操作。
根据在遵循URL时处理URL的服务器端软件,您可以使用像“;”这样的无问题字符而不是“&amp;”作为分隔符。
答案 2 :(得分:3)
http://www.htmlhelp.com/tools/validator/problems.html#amp(由http://validator.w3.org/docs/help.html的w3链接)解释了它。
&
标志着所谓entity
的开始。实体例如是€
(€),<
(&lt;),..
如果您现在输入了URL &lang
,则会在任何验证程序中引发错误,因为它不是有效的实体。然后浏览器会转发此序列。
解决方案:
您必须通过自己的实体&
转义&
,因此网址如下所示:
<a href="someurl?var=a&lang=english">Link 1</a>