如何编码查询参数以在Java中使用URL?我知道,这似乎是一个显而易见的问题。
我不确定有两个细微之处:
注意:
java.net.URLEncoder.encode
似乎无法正常工作,似乎是将数据编码为提交的表单。例如,它将空格编码为+
而不是%20
,并编码不必要的冒号。java.net.URI
不对查询参数进行编码答案 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先生在此主题中更好地回答。
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://foo或ftp://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")
不起作用。