我发现{6}中已弃用java.net.URLDecoder.decode(String)
。
我有以下字符串:
String url ="http://172.20.4.60/jsfweb/cat/%D7%9C%D7%97%D7%9E%D7%99%D7%9D_%D7%A8%D7%92%D7%99%D7%9C%D7%99%D7%9"
我应该如何在Java 6中解码它?
答案 0 :(得分:54)
您应该使用java.net.URI来执行此操作,因为URLDecoder类执行x-www-form-urlencoded解码是错误的(尽管名称,它是表单数据)。
答案 1 :(得分:27)
现在您需要指定字符串的字符编码。基于 URLDecoder
页面上的信息:
注意:万维网联盟 建议书指出UTF-8 应该使用。不这样做可能 引入不相容性。
以下内容对您有用:
java.net.URLDecoder.decode(url, "UTF-8");
击> <击> 撞击>
请参阅下面的Draemon's answer。
答案 2 :(得分:7)
如the documentation所述,decode(String)
已被弃用,因为它始终使用平台默认编码,这通常是错误的。
使用two-argument version instead。您需要指定转义部分使用的编码。
答案 3 :(得分:5)
仅弃用decode(String)
方法。您应该使用decode(String, String)
方法显式设置字符编码以进行解码。
答案 4 :(得分:2)
如前面的海报所述,您应该使用java.net.URI类来执行此操作:
System.out.println(String.format("Decoded URI: '%s'", new URI(url).getPath()));
我还要注意的是,如果你有一个URI的路径片段并且想要单独解码它,那么使用单参数构造函数的方法是相同的,但是如果你尝试使用四参数构造函数它没有:
String fileName = "Map%20of%20All%20projects.pdf";
URI uri = new URI(null, null, fileName, null);
System.out.println(String.format("Not decoded URI *WTF?!?*: '%s'", uri.getPath()));
这在Oracle JDK 7中进行了测试。这不起作用的事实是违反直觉的,与JavaDocs相反,它可能被认为是一个错误。
它可能会绊倒那些试图使用对称编码方法的人。正如本文中所述:&#34; how to encode URL to avoid special characters in java&#34;,为了编码 URI,通过传递不同的URI来构造URI是个好主意因为不同的编码规则适用于不同的部分,所以它们是分开的:
String fileName2 = "Map of All projects.pdf";
URI uri2 = new URI(null, null, fileName2, null);
System.out.println(String.format("Encoded URI: '%s'", uri2.toASCIIString()));