在URL中,空格应该使用%20还是+来编码?

在URL中,我应该使用%20还是+来编码空格? 例如,在下面的例子中,哪一个是正确的?

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

我们公司倾向于前者,但是使用带有"xbox 360" (和"UTF-8" )的Java方法URLEncoder.encode(String, String) ) 返回后者 。

那么,有什么区别?

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

URL编码为RFC 1738 ,它指定%20

理论上我觉得你应该在%20之前? 和+之后:

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

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

在查询string中,加号被保留为空格的简写符号。 因此,真正的加号必须被编码。 这个方法被用来使查询URI更容易在不允许空格的系统中通过。

根据RFC2396的第3.4节(通常是关于URI的官方规范),“查询”组件是与URL有关的:

3.4。 查询组件查询组件是由资源解释的一串信息。

  query = *uric 

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

因此,如果在其他软件中不接受查询string中带有空格的URL,并将其编码为“ + ”字符,那么这是一个错误。

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

这个混乱是因为URL到今天仍然是“破碎”的

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

我们可以提取有关“ http://www.google.com ”url的详细信息:

 +---------------+-------------------+ | 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,path片段部分中的空格必须编码为“%20”(不是,绝对不是“+”),而path片段部分中的“+”字符可以不进行编码。

现在在查询部分,空格可能被编码为“+”(为了向后兼容性:不要尝试在URI标准中search它)或“%20”而“+”字符(由于这种模糊性)必须被转移到“%2B”。

这意味着“蓝色+淡蓝色”string必须在path和查询部分中进行不同的编码:“ http://example.com/blue+light%20blue?blue%2Blight+blue ”。 从那里你可以推断出,如果没有URL结构的语法意识,编码完全构造的URL是不可能的。

这可归结为什么

你应该有%20之前? +之后

资源

不要紧,如果你把字母A编码为%41。

但是,如果你正在处理一个不能识别一个表单的系统,那么不pipe“规范”是什么,你只需要给它所期望的就可以了。

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

在对查询值进行编码时,无论是form还是percent-20,都是有效的。 然而,因为互联网的带宽并不是无限的,所以你应该使用加号,因为它less了两个字节。