我遇到了一个问题,该问题已通过我们的Google adwords驱动的营销 Activity 揭示出来。使用的标准参数之一是“区域”。当用户搜索并点击赞助商链接时,Google会生成一个长网址来跟踪点击,并在引荐来源网址中发送一堆东西。我们将其记录下来,以备记录,并且我们注意到“Region”参数传递不正确。应该是什么

http://ravercats.com/meow?foo=bar&region=catnip

相反通过:

http://ravercats.com/meow?foo=bar®ion=catnip

我已验证所有浏览器中都会发生这种情况。据我了解,HTML entity syntax的定义如下:
&VALUE;

其中前导边界是“&”号,而封闭边界是分号。似乎足够简单。问题在于,®实体没有得到尊重,这正在整个系统中造成各种破坏。

有人知道为什么会这样吗?这是DTD中的错误吗? (我正在寻找当前的HTML DTD,以了解是否可以理解它)我正在尝试找出实现这种情况的浏览器之间的共同点,因此我在寻找DTD。

这是您可以使用的证明。取得以下代码,制作一个HTML文件,并在浏览器中呈现它:
<html>
<a href="http://foo.com/bar?foo=bar&region=US&register=lowpass&reg_test=fail&trademark=correct">http://foo.com/bar?foo=bar&region=US&register=lowpass&reg_test=fail&trademark=correct</a>
</html>

编辑:对于建议我需要转义整个URL的每个人,上面的示例URL就是示例。真正的URL直接来自Google,我无法控制它的构造方式。这些建议虽然有效,但并未回答以下问题:“为什么会这样”。

最佳答案

尽管有效的字符引用始终在末尾使用分号,但是出于向后兼容性的原因,现代浏览器的HTML解析器可以识别一些不带分号的无效命名字符引用。

您要么知道整个列表是什么,要么遵循HTML5规则,以确保&何时有效而不被转义(例如,后面跟一个空格),否则在有疑问时始终以&的形式将&amp;转义为=

作为引用,可以识别不带分号的命名字符引用的完整列表为:

AElig,AMP,Aute,Acirc,Agrave,Aring,Atilde,Auml,COPY,Ccedil,ETH,Eacute,Ecirc,Egrave,Euml,GT,Iacute,Icirc,Igrave,Iuml,LT,Ntilde,Oacute,Ocirc,Ograve, Oslash,Otilde,Ouml,报价,REG,THORN,Uacute,Ucirc,Ugrave,Uuml,Yacute,aacute,acirc,急性,aelig,agrave,amp,aring,atilde,auml,brvbar,ccedil,cedil,分,副本, curren,deg,div,eacute,ecirc,egrave,eth,euml,frac12,frac14,frac34,gt,iacute,icirc,iexcl,igrave,iquest,iuml,laquo,lt,macr,micro,middot,nbsp,不是ntilde,oacute,ocirc,ograve,ordf,ordm,oslash,otilde,ouml,para,plusmn,磅,quot,raquo,reg,sect,害羞,sup1,sup2,sup3,szlig,刺,次,uacute,ucirc, ugrave,uml,uuml,yacute,日元,yuml

但是,应该注意的是,只有当在属性值中时,如果下一个字符是ojit_code或字母数字ASCII字符,则上述列表中的命名字符引用不会通过符合HTML5的解析器进行处理。

对于full list of named character references with or without ending semicolons, see here

07-25 23:15
查看更多