总之,HTML是一个很大的混乱(由于它的宽大),并使用分号有助于简化这是一个很大。
为了使用分号作为分隔符,我不知道.NET是否允许这种自定义,或者我们的开发人员是否需要编写自己的方法来处理QueryString。 .NET确实让我们可以访问原始的QueryString,我们可以从那里运行它。这就是我所做的。我编写了我自己的方法,但这并不难,但是它花费了大量的测试时间和调试,其中一些是微软在处理代理对时甚至不符合Web标准的错误。我确信我的实现可以使用包括多语言平面在内的全部Unicode字符(因此适用于中文和日文字符等)。在我添加我自己的发现之前,我还需要确认并包括Rawling,Jeevan和BeniBela在罗琳的回答中指出的以及他们对这样的答案的评论的伟大信息:HTML中的错误不能逃避它们,但是它通常起作用,但仅仅是因为解析器如此宽容。因此,我也解释了为什么这会导致错误的编码(这可能是大多数开发人员的牺牲品)。
人们不能依赖于查询字符串这个宽大不当编码与符号的,而有时这种宽大导致讨厌的错误。比方说,例如一个QueryString传递一个随机的ASCII字符串(或用户输入),它们没有正确编码。然后'amp''后面'&'被解码,意想不到的后果是'amp''实质上是“吞噬”。 (通过吞咽,我的意思是它被'吃掉'或者它不见了。)一个实际的使用场景是当用户被要求输入数据库并且用户输入HTML(像StackOverflow这样的)时,但是因为它不是张贴正确然后讨厌的错误发展。
的真正的优势“;”分隔符很简单:正确编码和号分隔的QueryStrings对HTML页面(也是XML)中的URL字符串采取两个步骤的复杂操作。将第一个键和值分解为URL编码,然后将其全部连接起来,然后整个QueryString或URL将被编码为HTML(或者对于使用与HTML编码类似的编码进行编码的XML)。另外请不要忘记,HTML编码和URL编码的编码过程是不同的,重要的是它们是不同的。开发者在两者之间需要小心。由于它们是相似的,新手程序员混淆它们并不罕见。
潜在问题的URL的一个很好的例子是在查询字符串传递两个名称/值时:
这里,使用 '&' 作为分隔符,然后 '?A =我+%26 +你& B =你+%26 +我' 是一个适当的查询字符串,但它shud也被HTML被写入之前编码HTML源代码。这对于无bug是很重要的。大多数开发人员不小心执行第一个URL的这个两步过程对键和值进行编码,然后对HTML源代码中的完整URL进行HTML编码。难怪为什么,当我不得不坐下来认真思考这个过程并彻底检验我的结论时。当名称值为'year =año'时进行成像,或者当我们需要使用代理对代表它们的中文或日文字符时,成像更复杂!
对于a和b,使用时与上述相同的密钥值对“;”作为分隔符,这个过程要简单得多。事实上,和号分隔符使得这个过程比使用分号分隔符复杂两倍多!以下是使用';'表示的相同信息作为分隔符:'?a =我+%26 +你; b =你+%26 +我'。我们注意到唯一的区别是字符串中没有'&'。但是用这个';'分隔符意味着不需要第二个HTML编码URL或QueryString的进程。现在想象一下,如果我正在编写HTML并想要正确的HTML,并且需要编写HTML来解释所有这些内容!所有这些'&'的HTML编码确实增加了很多复杂性(对许多开发人员来说,也有很多混乱)。
新手开发商WUD根本就不是HTML编码查询字符串或URL,这是正确的,当;是分隔符。但是,当&符号编码不正确时,会留下错误空间。所以'someText = blah & amp; blah'wud 需要正确的编码。
同样在.NET中,我们可以为我们的方法编写XML文档。那么,就在今天,我写了一个使用上面的'a = me +%26 + you & b = you +%26 + me'的例子。在我的XML中,我不得不手动输入所有那些功能; XML的字符实体。在XML文档中,它很挑剔,所以必须正确编码&符号。但HTML中的宽容性增加了含糊性。
也许这不是太混乱。但所有的困惑或困难都是由于使用了一种被HTML编码作为分隔符的字符,因此'&'是罪魁祸首。分号可以缓解所有这些并发症。
最后一个考虑:'&'分隔符使得这个过程变得复杂多了,所以我不奇怪为什么QueryStrings中的代理对的Microsoft实现仍然不遵循官方规范。如果您编写自己的方法,则必须说明Microsoft错误地使用百分比编码替代对。官方规范禁止UTF-8中代理对的百分比编码。因此,任何编写自己的方法的人也可以处理全部的Unicode字符,请注意这一点。
您是否有该报价的来源? – flup 2013-02-18 16:38:40
[Here](http://www.w3.org/TR/html4/appendix/notes.html#hB.2.2)[非常简短的Google](http://www.google.co.uk/search ?HL = EN&q =%22CGI +实施者+支持的%+ 22 +使用+)。 – Rawling 2013-02-18 16:39:39
我认为这不是很多,而不是。但是还有。 – flup 2013-02-18 16:44:03