在网址中,我应该使用%20
还是+
对空格进行编码?例如,在以下示例中,哪一个是正确的?
www.mydomain.com?type=xbox%20360
www.mydomain.com?type=xbox+360
我们公司倾向于前者,但使用Java方法URLEncoder.encode(String, String)
和"xbox 360"
(以及"UTF-8"
)returns the latter。
那么,有什么区别?
答案 0 :(得分:94)
表单数据(用于GET或POST)通常编码为application/x-www-form-urlencoded
:这为空格指定+
。
网址编码为RFC 1738,指定%20
。
从理论上讲,我认为你应该在?
和之后+%之前得到%20。
example.com/foo%20bar?foo+bar
答案 1 :(得分:47)
根据W3C(它们是这些东西的官方来源),查询字符串中的空格字符(以及仅在查询字符串中)可以编码为“%20
”或“+
”。从“建议”下的“查询字符串”部分:
在查询字符串中,加号被保留为空格的简写表示法。因此,必须编码真正的加号。此方法用于使查询URI更容易在不允许空格的系统中传递。
根据RFC2396的第3.4节,这是关于URI的官方规范,“查询”组件依赖于URL:
3.4。查询组件 查询组件是要解释的信息字符串 资源。
query = *uric
在查询组件中,字符“;”,“/”,“?”,“:”,“@”, “&”,“=”,“+”,“,”和“$”是保留的。
如果它不接受编码为“+
”字符的查询字符串中带有空格的URL,则它是其他软件中的错误。
至于问题的第三部分,修复URLEncoder.encode()
输出的一种方法(虽然稍微丑陋)是返回值的call replaceAll("\\+","%20")
。
答案 2 :(得分:13)
这种混淆是因为网址仍然被破坏了#39;直到今天
采取" http://www.google.com"例如。这是一个URL。一个URL 是一个统一资源定位器,实际上是一个指向网页的指针 (在多数情况下)。 URL实际上具有非常明确的结构 自1994年的第一个规范以来。
我们可以提取有关" 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&#34 ;.从那里 您可以推断出编码完全构造的URL是不可能的 没有语法上对URL结构的认识。
归结为
您应该在%20
和?
之后+
答案 3 :(得分:6)
不应该重要,只不过将字母A编码为%41。
但是,如果您正在处理一个无法识别某个表单的系统,那么无论“规范”的内容如何,您似乎都必须提供它所期望的内容。
答案 4 :(得分:5)
你可以使用 - 这意味着大多数人选择“+”,因为它更具人性化。
答案 5 :(得分:-1)
编码查询值时,form,plus或percent-20有效;但是,由于互联网的带宽不是无限的,你应该使用加号,因为它的字节数减少了两个。