我在期待
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),所以对这个答案持保留态度。
其他回答
试试下面的方法:
添加一个新的依赖项
<!-- 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
我用错方法了吗?我应该使用的正确方法是什么?
是的,这个方法java.net.URLEncoder.encode并不是根据规范将“”转换为“20%”。
空格字符“”被转换为加号“+”。
即使这不是正确的方法,您也可以将其修改为:System.out.println(java.net.URLEncoder.encode(“Hello World”,“UTF-8”)。replaceAll("\\+", "%20"));祝你今天愉快=)。
Hello+World是浏览器为GET请求编码表单数据(application/x-www-form-urlencoded)的方式,这是URI查询部分的普遍接受的形式。
http://host/path/?message=Hello+World
如果将此请求发送到Java servlet, servlet将正确解码参数值。通常唯一出现问题的情况是编码不匹配。
严格来说,HTTP或URI规范中没有要求使用application/x-www-form- urlenencoded键-值对对查询部分进行编码;查询部分只需采用web服务器接受的形式即可。实际上,这不大可能成为一个问题。
对于URI的其他部分(例如路径)使用这种编码通常是不正确的。在这种情况下,您应该使用RFC 3986中描述的编码方案。
http://host/Hello%20World
更多的在这里。
“+”是正确的。如果你真的需要%20,然后自己替换加。
警告:这个答案有很大的争议(+8 vs. -6),所以对这个答案持保留态度。
一个空格在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。替换,这只会编码空间。使用库代替。