【发布时间】:2011-09-25 01:45:12
【问题描述】:
我看到 java.net.URLDecoder.decode(String) 在 6 中已弃用。
我有以下字符串:
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 中对其进行解码?
【问题讨论】:
标签: java
我看到 java.net.URLDecoder.decode(String) 在 6 中已弃用。
我有以下字符串:
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 中对其进行解码?
【问题讨论】:
标签: java
您应该使用java.net.URI 来执行此操作,因为 URLDecoder 类执行 x-www-form-urlencoded 解码,这是错误的(尽管名称如此,但它用于表单数据)。
【讨论】:
application/x-www-form-urlencoded 指的是用于 URL 的编码,URLDecoder 指定的详细规则明确它完全适用于解码一个网址。所以使用URLDecoder 更简单,可能更快。
现在您需要指定字符串的字符编码。根据URLDecoder 页面上的信息:
注意:万维网联盟 建议指出 UTF-8 应该使用。不这样做可能 引入不兼容的东西。
以下内容应该适合您:
java.net.URLDecoder.decode(url, "UTF-8");
请参阅下面的Draemon's answer。
【讨论】:
application/x-www-form-urlencoded 指的是用于 URL 的编码,URLDecoder 指定的详细规则清楚地表明它在解码 URL 时完全有效。所以使用URLDecoder 更简单,而且可能更快。我建议你取消这个答案。
正如the documentation 所提到的,decode(String) 已被弃用,因为它始终使用平台默认编码,这通常是错误的。
使用two-argument version instead。您需要指定转义部分使用的编码。
【讨论】:
仅不推荐使用 decode(String) 方法。您应该使用decode(String, String) 方法显式设置用于解码的字符编码。
【讨论】:
正如之前的海报所指出的,您应该使用 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 相悖,应该被认为是一个错误。
它可能会绊倒试图使用与编码对称的方法的人。正如这篇文章中提到的示例:“how to encode URL to avoid special characters in java”,为了编码 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()));
【讨论】: