在一个网址,我应该使用编码的空间%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
根据W3C (和它们在这些东西的官方源),在查询字符串一个空格字符(和在查询字符串只)可以被编码为“ %20
”或“ +
”。 从在“建议”小节“查询字符串”:
在查询字符串,加号被保留为一个空间速记符号。 因此,真正的加号必须被编码。 用这种方法,使查询更方便的URI中不允许空间系统通过。
根据第3.4 RFC2396这是对一般的URI的正式规范,“查询”部分是URL相关:
3.4。 查询组件查询组件是一个信息串由资源进行解释。
query = *uric
中的查询部件,字符 “;”, “/”, “:”, “@”, “&”, “=”, “+”, “”,和 “$” 被保留 “?”。
因此,在其他软件中的错误,如果它不接受经编码为“查询字符串空格的URL +
”字。
至于你的问题的第三部分,一个方法(虽然略有丑陋的),以解决从输出URLEncoder.encode()
是那么叫 replaceAll("\\+","%20")
的返回值。
这种混乱是因为URL仍然是“破”的这一天
以“ http://www.google.com ”的实例。 这是一个URL。 URL是统一资源定位符,是一个真正的指向一个网页(在大多数情况下)。 网址居然有自1994年第一次规范非常明确的结构。
我们可以提取有关“的详细信息http://www.google.com ”网址:
+---------------+-------------------+
| Part | Data |
+---------------+-------------------+
| Scheme | http |
| Host address | www.google.com |
+---------------+-------------------+
如果我们来看一个更复杂的URL,例如“ https://开头鲍勃:bobby@www.lunatech.com:8080 /文件; P = 1,Q = 2#第三 ”我们可以提取如下信息:
+-------------------+---------------------+
| 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
前?
和+
后
资源
它不应该的问题,任何比,如果你编码的字母A为41%以上。
但是,如果你处理不承认一种形式的系统,它好像你只是将不得不给它什么,它预计,无论什么“规范”说。
您可以使用 - 这意味着大多数人选择“+”,因为它更可读。
当编码查询值,任一种形式,再加上或百分比-20,是有效的; 然而,由于互联网的带宽不是无限的,你应该使用加,因为它是少两个字节。