Loading...
请注意,本文编写于 346 天前,最后修改于 317 天前,其中某些信息可能已经过时。
## 问题
在对URL进行encode编码的时候,URL中的空格有时候被编码成`%20`,有时候被编码成加号`+`。大多数情况下,这两种编码都可以工作,但个别情况下,编码为`+`的URL存在问题,并不能正常访问。
## 原因
一个URL的基本组成部分包括协议(scheme),域名,端口号,路径和查询字符串(路径参数和锚点标记就暂不考虑了)。路径和查询字符串之间用问号?分离。
例如`http://www.example.com/index?param=1`,路径为`index`,查询字符串(Query String)为`param=1`。
以上例子中URL中关于空格的编码正是与空格所在位置相关:空格被编码成加号+的情况只会在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中。
造成这种混乱局面的原因在于:[W3C标准规定](http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1),当`Content-Type`为`application/x-www-form-urlencoded`时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号`+`。
而在另一份