URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
12条答案
按热度按时间55ooxyrt1#
我为你的问题找到了一个简单的解决办法。我也想使用一个编码的网址,但没有帮助我。
http://example.com/query?q=random%20word%20%a3500%20bank%20%24
使用string example=“random word£银行500美元“;你可以在下面的代码。
p1tboqfb2#
在android中,我会使用以下代码:
哪里
Uri
是一个android.net.Uri
von4xj4u3#
Guava15现在添加了一组简单的url转义器。
50few1ms4#
下面是一个方法,您可以在代码中使用它将url字符串和参数Map转换为包含查询参数的有效编码url字符串。
f87krz0w5#
URLEncoder
是一条路要走。只需记住只编码单个查询字符串参数名称和/或值,而不编码整个url,当然不编码查询字符串参数分隔符字符&
也不是参数名值分隔符字符=
.当您还没有使用Java10或更新版本时,请使用
StandardCharsets.UTF_8.toString()
作为charset参数,或者当您还没有使用Java7或更新版本时,使用"UTF-8"
.请注意,查询参数中的空格由
+
,不是%20
,合法有效。这个%20
通常用于表示uri本身中的空间(uri查询字符串分隔符前面的部分)?
),不在查询字符串中(后面的部分?
).还要注意有三个
encode()
方法。一个没有Charset
作为第二个论点String
作为引发选中异常的第二个参数。没有的那个Charset
参数已弃用。永远不要使用它,并始终指定Charset
争论。javadoc甚至明确建议按照rfc3986和w3c的要求使用utf-8编码。所有其他字符都是不安全的,首先使用某种编码方案将其转换为一个或多个字节。然后每个字节由3个字符的字符串“%xy”表示,其中xy是字节的两位十六进制表示。建议使用的编码方案是utf-8。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。
另请参见:
每个web开发人员都必须了解url编码
kmpatx3s6#
您需要首先创建一个uri,如:
然后将uri转换为ascii字符串:
现在你的url字符串是完全编码的,首先我们做了简单的url编码,然后我们把它转换成ascii字符串,以确保字符串中没有ascii以外的字符。浏览器就是这样做的。
b1payxdu7#
印刷品
这里发生了什么?
1.将url拆分为结构部分。使用
java.net.URL
为了它。2.正确编码每个结构部分!
3.使用
IDN.toASCII(putDomainNameHere)
对主机名进行punycode编码!4.使用
java.net.URI.toASCIIString()
对于百分比编码,nfc编码的unicode-(最好是nfkc!)。有关更多信息,请参阅:如何正确编码此url在某些情况下,建议检查url是否已编码。还将“+”编码的空格替换为“%20”编码的空格。
下面是一些也能正常工作的例子
该解决方案通过了web平台测试提供的大约100个测试用例。
kdfy810k8#
我不会用
URLEncoder
. 除了名字不正确(URLEncoder
与URL无关),效率低下(它使用StringBuffer
而不是建设者和做一些其他事情是缓慢的)它的方式也太容易搞砸了。相反,我会用
URIBuilder
或者Spring的org.springframework.web.util.UriUtils.encodeQuery
或共享apacheHttpClient
. 原因是您必须转义查询参数名称(即balusc的答案)q
)与参数值不同。上面提到的唯一缺点(我痛苦地发现)是url不是uri的真正子集。
示例代码:
因为我只是链接到其他答案,所以我将此标记为社区wiki。请随意编辑。
9rygscc19#
使用spring的uricomponentsbuilder:
ac1kyiln10#
apache http组件库为构建和编码查询参数提供了一个简洁的选项-
对于httpcomponents 4.x,使用-urlencodedutils
对于httpclient 3.x,请使用-encodingutil
n3ipq98p11#
在我的例子中,我只需要传递整个url并只编码每个参数的值。我没有找到这样做的通用代码(!!)所以我创建了一个小方法来完成这项工作:
它使用org.apache.commons.lang3.stringutils
9nvpjoqh12#
使用这个:urlencoder.encode(query,standardcharsets.utf8.displayname());或者this:urlencoder.encode(查询“utf-8”);
您可以使用以下代码。