我在期待
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
输出:
你好%20世界
(20是ASCII十六进制空格码)
然而,我得到的是:
你好+世界
我用错方法了吗?我应该使用的正确方法是什么?
我在期待
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
输出:
你好%20世界
(20是ASCII十六进制空格码)
然而,我得到的是:
你好+世界
我用错方法了吗?我应该使用的正确方法是什么?
当前回答
“+”是正确的。如果你真的需要%20,然后自己替换加。
警告:这个答案有很大的争议(+8 vs. -6),所以对这个答案持保留态度。
其他回答
只是在Android上也在挣扎,设法偶然发现了Uri。encode(字符串,字符串)而特定于android (android.net.Uri)可能对一些有用。
静态字符串编码(字符串s,字符串允许)
以https://developer.android.com/reference/android/net/Uri.html编码(以)
“+”是正确的。如果你真的需要%20,然后自己替换加。
警告:这个答案有很大的争议(+8 vs. -6),所以对这个答案持保留态度。
试试下面的方法:
添加一个新的依赖项
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>10.0.13</version>
</dependency>
现在按照下面的步骤做:
String str = "Hello+World"; // For "Hello World", decoder is not required
// import java.net.URLDecoder;
String newURL = URLDecoder.decode(str, StandardCharsets.UTF_8);
// import org.apache.catalina.util.URLEncoder;
System.out.println(URLEncoder.DEFAULT.encode(newURL, StandardCharsets.UTF_8));
你会得到如下的输出:
Hello%20World
如果您正在使用jetty,那么org.eclipse.jetty.util.URIUtil将解决这个问题。
String encoded_string = URIUtil.encodePath(not_encoded_string).toString();
查询参数
org.apache.commons.httpclient.util.URIUtil
URIUtil.encodeQuery(input);
如果你想转义URI中的字符
public static String escapeURIPathParam(String input) {
StringBuilder resultStr = new StringBuilder();
for (char ch : input.toCharArray()) {
if (isUnsafe(ch)) {
resultStr.append('%');
resultStr.append(toHex(ch / 16));
resultStr.append(toHex(ch % 16));
} else{
resultStr.append(ch);
}
}
return resultStr.toString();
}
private static char toHex(int ch) {
return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnsafe(char ch) {
if (ch > 128 || ch < 0)
return true;
return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}