130

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

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

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

那么,有什么区别呢?

4

6 回答 6

119

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

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

从理论上讲,我认为您应该在 %20 之前?和 + 之后:

example.com/foo%20bar?foo+bar
于 2009-07-31T08:08:58.187 回答
53

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

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

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

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

   query         = *uric

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

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

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

于 2009-07-31T08:09:42.663 回答
25

这种混淆是因为 URL 直到今天仍然“损坏”

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

我们可以提取有关“ 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 ”。从那里你可以推断,如果没有对 URL 结构的句法意识,编码一个完全构造的 URL 是不可能的。

这归结为

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

资源

于 2015-11-26T12:54:24.410 回答
8

没关系,就像您字母 A 编码为 %41 一样。

但是,如果您正在处理一个无法识别一种形式的系统,那么无论“规范”说什么,您似乎都只需要给它期望的东西。

于 2009-07-31T08:07:47.813 回答
5

您可以使用其中任何一个 - 这意味着大多数人选择“+”,因为它更易于阅读。

于 2009-07-31T08:10:39.620 回答
0

对查询值进行编码时,形式、加号或百分比 20 均有效;但是,由于互联网的带宽不是无限的,您应该使用 plus,因为它少了两个字节。

于 2015-03-15T18:33:57.800 回答