在URL中,我应该使用%20
还是+
对空格进行编码?例如,在下面的示例中,哪一个是正确的?
www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360
我们公司倾向于前者,但是使用Java方法URLEncoder.encode(String, String)
并使用"xbox 360"
(和"UTF-8"
)返回后者。
那么,这两者有什么区别呢?
在URL中,我应该使用%20
还是+
对空格进行编码?例如,在下面的示例中,哪一个是正确的?
www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360
我们公司倾向于前者,但是使用Java方法URLEncoder.encode(String, String)
并使用"xbox 360"
(和"UTF-8"
)返回后者。
那么,这两者有什么区别呢?
表单数据(GET或POST)通常编码为application/x-www-form-urlencoded
:这指定了空格的表示方式是+
。
URL编码遵循RFC 1738,其中指定空格的表示方式是%20
。
理论上,在?
之前应该使用%20
,之后应该使用+
:
example.com/foo%20bar?foo+bar
mailto:support@example.org?subject=I%20need%20help
- Sygmoral%20
”或“+
”。从“推荐”下的“查询字符串”部分:因此,如果其他软件无法接受查询字符串中包含空格的URL编码为"3.4. Query Component The query component is a string of information to be interpreted by the resource.
query = *uric
Within a query component, the characters ";", "/", "?", ":", "@", "&", "=", "+", ",", and "$" are reserved.
+
"字符,则存在错误。URLEncoder.encode()
输出的方法是在返回值上call 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,路径片段中的空格必须编码为“%20”(绝对不是“+”),而路径片段中的“+”字符可以不编码。
现在在查询部分,空格可以编码为“+”(出于向后兼容性考虑:不要尝试在URI标准中搜索它)或“%20”,而“+”字符(由于这种歧义)必须转义为“%2B”。
这意味着“blue+light blue”字符串必须在路径和查询部分中以不同的方式进行编码: "http://example.com/blue+light%20blue?blue%2Blight+blue"。从那里 您可以推断出,在没有URL结构的语法意识的情况下编码完全构造的URL是不可能的。
简而言之:
你应该在?
之前加上%20
,并在+
之后添加
这并不重要,就像你把字母A编码为%41一样。
但是,如果你处理的系统无法识别其中一种形式,似乎你只能按照它期望的方式提供数据,而不管“规范”中说了什么。
在编码查询值时,使用表单、加号或百分号-20都是有效的;然而,由于互联网的带宽并不是无限的,你应该使用加号,因为它少了两个字节。