在URL中,是否应使用%20或+编码空格?

时间:2009-07-31 08:02:28

标签: url urlencode url-encoding

在网址中,我应该使用%20还是+对空格进行编码?例如,在以下示例中,哪一个是正确的?

www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360

我们公司倾向于前者,但使用Java方法URLEncoder.encode(String, String)"xbox 360"(以及"UTF-8"returns the latter

那么,有什么区别?

6 个答案:

答案 0 :(得分:94)

表单数据(用于GET或POST)通常编码为application/x-www-form-urlencoded:这为空格指定+

网址编码为RFC 1738,指定%20

从理论上讲,我认为你应该在?和之后+%之前得到%20。

example.com/foo%20bar?foo+bar

答案 1 :(得分:47)

根据W3C(它们是这些东西的官方来源),查询字符串中的空格字符(以及仅在查询字符串中)可以编码为“%20”或“+”。从“建议”下的“查询字符串”部分:

  

在查询字符串中,加号被保留为空格的简写表示法。因此,必须编码真正的加号。此方法用于使查询URI更容易在不允许空格的系统中传递。

根据RFC2396的第3.4节,这是关于URI的官方规范,“查询”组件依赖于URL:

  

3.4。查询组件           查询组件是要解释的信息字符串           资源。

   query         = *uric
     

在查询组件中,字符“;”,“/”,“?”,“:”,“@”,      “&”,“=”,“+”,“,”和“$”是保留的。

如果它不接受编码为“+”字符的查询字符串中带有空格的URL,则它是其他软件中的错误。

至于问题的第三部分,修复URLEncoder.encode()输出的一种方法(虽然稍微丑陋)是返回值的call replaceAll("\\+","%20")

答案 2 :(得分:13)

这种混淆是因为网址仍然被破坏了#39;直到今天

  

采取" http://www.google.com"例如。这是一个URL。一个URL   是一个统一资源定位器,实际上是一个指向网页的指针   (在多数情况下)。 URL实际上具有非常明确的结构   自1994年的第一个规范以来。

     

我们可以提取有关" http://www.google.com"的详细信息。   网址:

+---------------+-------------------+   
|      Part     |      Data         |   
+---------------+-------------------+   
|  Scheme       | http              |   
|  Host address | www.google.com    |   
+---------------+-------------------+  
  

如果我们再观察一下   复杂的URL如   " https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third"我们可以   提取以下信息:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host address     | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file               |
|  Path parameters  | p=1                 |
|  Query parameters | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+
  

每个部分的保留字符不同

     

对于HTTP URL,必须对路径片段部分中的空间进行编码   "%20" (不是,绝对不是" +"),而" +"路径中的人物   片段部分可以不加编码。

     

现在在查询部分中,空格可以编码为" +" (对于   向后兼容性:不要尝试在URI中搜索它   标准)或"%20"而" +"角色(由于这个原因   歧义)必须被转移到"%2B"。

     

这意味着"蓝色+浅蓝色"字符串必须编码   不同的路径和查询部分:   " http://example.com/blue+light%20blue?blue%2Blight+blue&#34 ;.从那里   您可以推断出编码完全构造的URL是不可能的   没有语法上对URL结构的认识。

归结为

您应该在%20?之后+

Source

答案 3 :(得分:6)

不应该重要,只不过将字母A编码为%41。

但是,如果您正在处理一个无法识别某个表单的系统,那么无论“规范”的内容如何,​​您似乎都必须提供它所期望的内容。

答案 4 :(得分:5)

你可以使用 - 这意味着大多数人选择“+”,因为它更具人性化。

答案 5 :(得分:-1)

编码查询值时,form,plus或percent-20有效;但是,由于互联网的带宽不是无限的,你应该使用加号,因为它的字节数减少了两个。