此问题涉及 URL 查询字符串部分中的字符,这些字符出现在?
标记字符。
Per 维基百科 http://en.wikipedia.org/wiki/Query_string,某些字符保留原样,而其他字符则进行编码(通常使用%
转义序列)。
我一直在尝试将其追溯到实际规范,以便我了解维基百科页面中每个要点背后的理由。
矛盾例1:
The HTML规范 http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type说将空间编码为+
并将其余的推迟到RFC1738 http://www.ietf.org/rfc/rfc1738.txt。然而,这个 RFC 说~
是不安全的,而且“所有不安全字符必须始终在 URL 中进行编码”。这似乎与维基百科相矛盾。
实际上,IE8 编码~
在它生成的查询字符串中,而 FF3 保持原样。
矛盾例2:
维基百科指出,它未提及的所有字符都必须进行编码。!
维基百科中没有提及。但RFC1738 http://www.ietf.org/rfc/rfc1738.txt指出!
是一个“特殊”字符并且“可以不编码地使用”。这似乎与维基百科所说的必须进行编码相矛盾。
实际上,IE8 编码!
在它生成的查询字符串中,而 FF3 保持原样。
我知道这样做的寓意可能是对维基百科和规范之间有疑问的那些字符进行编码。甚至可能对除 [A-Za-z0-9] 之外的所有内容进行编码。我只是想知道这方面的实际标准。
结论
维基百科上描述的算法精确地编码了那些不是的字符RFC3986 非保留字符 https://www.rfc-editor.org/rfc/rfc3986#section-2.3。也就是说,它对除字母数字之外的所有字符进行编码-._~
。作为一种特殊情况,空间被编码为+
代替%20
根据 RFC3986。
某些应用程序使用较旧的 RFC。为了比较,将RFC2396 非保留字符 https://www.rfc-editor.org/rfc/rfc2396#page-9是字母数字和!'()*-._~
.
为了比较,将HTML5算法工作草案 http://dev.w3.org/html5/spec/Overview.html#application-x-www-form-urlencoded-encoding-algorithm对除字母数字之外的所有字符进行编码*-._
。空间的特殊情况编码仍然存在+
。显着的差异是*
未编码并且~
被编码。 (从技术上讲,这种处理*
与 RFC3986 兼容,尽管*
is in reserved
因为它是在sub-delims
哪些是允许的query
生产。)