我在期待

System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));

输出:

你好%20世界

(20是ASCII十六进制空格码)

然而,我得到的是:

你好+世界

我用错方法了吗?我应该使用的正确方法是什么?


当前回答

它不是一行代码,但是你可以使用:

URL url = new URL("https://some-host.net/dav/files/selling_Rosetta Stone Case Study.png.aes");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
System.out.println(uri.toString());

这将给你一个输出:

https://some-host.net/dav/files/selling_Rosetta%20Stone%20Case%20Study.png.aes

其他回答

这对我很有效

org.apache.catalina.util.URLEncoder ul = new org.apache.catalina.util.URLEncoder().encode("MY URL");

虽然很老了,但还是迅速回应:

Spring提供了UriUtils -使用它你可以指定如何编码以及它与URI的哪个部分相关。

encodePathSegment
encodePort
encodeFragment
encodeUriVariables
....

我使用它们是因为我们已经在使用Spring,即不需要额外的库!

查看uri类。

只是在Android上也在挣扎,设法偶然发现了Uri。encode(字符串,字符串)而特定于android (android.net.Uri)可能对一些有用。

静态字符串编码(字符串s,字符串允许)

以https://developer.android.com/reference/android/net/Uri.html编码(以)

一个空格在url中被编码为%20,在表单提交的数据中被编码为+(内容类型为application/x-www-form-urlencoded)。你需要前者。

使用番石榴:

dependencies {
     compile 'com.google.guava:guava:23.0'
     // or, for Android:
     compile 'com.google.guava:guava:23.0-android'
}

你可以使用UrlEscapers:

String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);

不要使用String。替换,这只会编码空间。使用库代替。