Java 6中的URL解码

时间:2011-06-29 11:16:17

标签: java

我发现{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中解码它?

5 个答案:

答案 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()));