本问题涉及URL查询字符串部分中的字符,这些字符出现在问号?
标记字符之后。
根据维基百科的说法,某些字符保持原样,另一些字符使用编码(通常使用%
转义序列)。
我一直在试图查找实际规范,以便了解那个维基百科页面中每个项目背后的理由。
矛盾示例1:
HTML规范指定将空格编码为+
,其余部分推迟到RFC1738。但是,该RFC表示~
不安全,并且“[必须始终在URL中对所有不安全的字符进行编码]”。这似乎与维基百科相矛盾。
在实践中,IE8将~
编码为生成的查询字符串,而FF3则保留原样。
矛盾示例2:
维基百科指出,它没有提到的所有字符都必须编码。在维基百科中没有提到!
。但是RFC1738表示!
是一个“特殊”字符,可以“未编码”使用。这似乎与维基百科所说的必须编码相矛盾。
在实践中,IE8将!
编码为生成的查询字符串,而FF3则保留原样。
我明白这背后的道理可能是对于维基百科和规范之间存在疑问的那些字符进行编码。甚至可能进一步编码非[A-Za-z0-9]的所有内容。我只想知道实际标准是什么。
结论
维基百科上介绍的算法准确地对那些不属于RFC3986未保留字符集的字符进行编码。也就是说,它会对除了字母数字和-._~
之外的所有字符进行编码。特别地,空格会被编码为+
而不是%20
,符合RFC3986的规定。
一些应用程序使用较早的RFC。以RFC2396未保留字符集为例,其中包含字母数字和!'()*-._~
。
相比之下,HTML5工作草案算法将除字母数字和*-._
之外的所有字符进行编码。空格的特殊情况仍然被编码为+
。值得注意的区别在于,*
不会被编码,而~
会被编码。(严格来说,这种处理方式与RFC3986兼容,即使*
包含在保留字符集
中,因为它在查询
产生中是允许的子分隔符之一。)