在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了两个字节。