在Java中编码URL查询参数

时间:2011-03-16 18:38:25

标签: java urlencode

如何编码查询参数以在Java中使用URL?我知道,这似乎是一个显而易见的问题。

我不确定有两个细微之处:

  1. 空格应该在网址上编码为“+”还是“%20”?在Chrome中,如果我输入“http://google.com/foo=?bar me”chrome,则将其更改为使用%20进行编码
  2. 将冒号“:”编码为%3B是否必要/正确? Chrome没有。
  3. 注意:

    • java.net.URLEncoder.encode似乎无法正常工作,似乎是将数据编码为提交的表单。例如,它将空格编码为+而不是%20,并编码不必要的冒号。
    • java.net.URI不对查询参数进行编码

7 个答案:

答案 0 :(得分:110)

java.net.URLEncoder.encode(String s, String encoding)也可以提供帮助。它遵循HTML表单编码application/x-www-form-urlencoded

URLEncoder.encode(query, "UTF-8");

另一方面,Percent-encoding(也称为URL encoding)使用%20对空间进行编码。冒号是一个保留字符,因此编码后:仍然是冒号。

答案 1 :(得分:14)

编辑:URIUtil在最近的版本中不再可用,在Java - encode URL或Sindi先生在此主题中更好地回答。


Apache httpclient的

URIUtil非常有用,尽管有一些alternatives

URIUtil.encodeQuery(url);
  

例如,它将空格编码为“+”而不是“%20”

两者都是perfectly valid in the right context。虽然如果您真的喜欢,可以发出字符串替换。

答案 2 :(得分:10)

不幸的是,URLEncoder.encode()不会产生有效的百分比编码(在http://tools.ietf.org/html/rfc3986#section-2.1中指定)。

URLEncoder.encode()编码一切正常,除了空间被编码为" +"。我能找到的所有Java URI编码器只公开公共方法来编码查询,片段,路径部分等 - 但是不要暴露" raw"编码。这很不幸,因为允许片段和查询将空间编码为+,因此我们不想使用它们。路径编码正确但是标准化"首先,我们不能将它用于' generic'编码。

我能提出的最佳解决方案:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

如果replaceAll()对你来说太慢了,我想替代方法就是推出自己的编码器......

编辑:我先在这里编写了这段代码,它没有编码"?","&"," ="正确:

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

答案 3 :(得分:8)

在查询中没有必要将冒号编码为%3B,尽管这样做并非违法。

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

似乎只有百分比编码的空格是有效的,因为我怀疑空间是ALPHA还是DIGIT

查看the URI specification了解详情。

答案 4 :(得分:5)

内置的Java URLEncoder正在做它应该做的事情,你应该使用它。

“+”或“%20”是两个 URL中空格字符的有效替换。任何一个都可以工作。

进行编码,因为它是一个分隔符。即http://fooftp://bar。特定浏览器在未编码时可以处理它的事实并不能使其正确。你应该对它们进行编码。

作为一种良好实践,请务必使用采用字符编码参数的方法。通常在那里使用UTF-8,但是你应该明确地提供它。

URLEncoder.encode(yourUrl, "UTF-8");

答案 5 :(得分:0)

如果您的网址中只有空格问题。我用下面的代码,它工作正常

String url;
URL myUrl = new URL(url.replace(" ","%20"));

示例:网址为

  

www.xyz.com?para=你好先生

则muUrl的输出为

  

www.xyz.com?para=hello%20sir

答案 6 :(得分:0)

String param="2019-07-18 19:29:37";
param="%27"+param.trim().replace(" ", "%20")+"%27";

我观察到日期时间(时间戳) URLEncoder.encode(param,"UTF-8")不起作用。