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

Meg*_*ter 111 url urlencode url-encoding

在URL中,我应该使用%20或编码空格+吗?例如,在以下示例中,哪一个是正确的?

www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360
Run Code Online (Sandbox Code Playgroud)

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

那么,有什么区别?

Gre*_*reg 97

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

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

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

example.com/foo%20bar?foo+bar
Run Code Online (Sandbox Code Playgroud)

  • 除了在电子邮件链接中,因为使用+ es之后?将导致电子邮件打开+ es仍然在那里.所以:`mailto:support@example.org?subject = I%20need%20help` (9认同)

Ada*_*kin 49

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

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

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

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

   query         = *uric
Run Code Online (Sandbox Code Playgroud)

在查询组件中,保留字符";","/","?",":","@","&","=","+",","和"$".

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

至于你问题的第三部分,修复输出的一种方法(尽管有点丑陋)URLEncoder.encode()调用 replaceAll("\\+","%20")返回值.


Mat*_*ius 14

这种混淆是因为URL至今仍"破碎"

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

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

+---------------+-------------------+   
|      Part     |      Data         |   
+---------------+-------------------+   
|  Scheme       | http              |   
|  Host address | www.google.com    |   
+---------------+-------------------+  
Run Code Online (Sandbox Code Playgroud)

如果我们查看更复杂的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               |
+-------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

每个部分的保留字符都不同

对于HTTP URL,路径片段部分中的空间必须编码为"%20"(不是,绝对不是"+"),而路径片段部分中的"+"字符可以保持未编码状态.

现在在查询部分中,空格可以编码为"+"(为了向后兼容:不尝试在URI标准中搜索它)或"%20"而不是"+"字符(由于这种模糊性)必须逃到"%2B".

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

这可以归结为

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

资源


Gar*_*ill 6

不应该没关系,任何比,如果你编码的字母A为41%以上.

但是,如果您正在处理一个无法识别某个表单的系统,那么无论"规范"是什么,您似乎都必须给它预期的结果.


Fen*_*ton 5

您可以使用 - 这意味着大多数人选择"+",因为它更具人性化.