Java 6中的URL解码

19

我看到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中对其进行解码?

5个回答

58
你应该使用 java.net.URI 来实现此功能,因为 URLDecoder 类执行的是错误的 x-www-form-urlencoded 解码(尽管名称中包含“form”),而不是解析 URL。

6
谁曾经点了反对?能否详细说明哪个部分是错误的? - Draemon
3
这是正确的答案!这常常会让人困惑。URLEncoder/URLDecoder是用于编码和解码表单数据在URL中的,而不是URL本身。URL类提供了URL本身的编码和解码。URI类是一个更新、更好规定、更通用的API--每个URL字符串也是一个URI字符串,因此使用URI进行解析任务。URL类本身警告不要混淆URLEncoder/Decoder的用途:"URLEncoder和URLDecoder类也可以使用,但仅适用于HTML表单编码,这与RFC2396定义的编码方案不同。" - Bob Kerns
2
java.net.URI.decode()现在是私有的。 - Azee
3
application/x-www-form-urlencoded”这种媒体类型是指用于URL编码的方式,而由URLDecoder指定的详细规则清楚地表明它完全可以用于解码URL。因此,使用URLDecoder更简单、可能也更快。 - Lawrence Dol
3
URLDecoder将把“+”替换为“ ”,这是不正确的。在查询字符串键和值中,“+”应该只被改为“ ”。 - Dobes Vandermeer

27
现在您需要指定字符串的字符编码。根据URLDecoder页面上的信息:

注意:万维网联盟建议使用UTF-8。否则可能会引入不兼容性。

以下内容适用于您:

java.net.URLDecoder.decode(url, "UTF-8");

请参见下面Draemon的答案

4
这完全是错误的。文档清楚地表明此方法使用 application/x-www-form-urlencoded 格式,该格式仅用于查询字符串。 - Draemon
-1 请查看我在@Draemon的正确答案下的评论。 - Bob Kerns
3
如果问题本身正确的话,这将是正确的答案!如果您正确地使用了一参数版本的decode(),那么应该使用二参数版本。 - Bob Kerns
+1 鼓励用户查看其他答案。 :) - 700 Software
1
这个答案实际上是正确的,因为所引用的表单编码是URL编码。媒体类型 application/x-www-form-urlencoded 是指用于URL的编码方式,而由URLDecoder指定的详细规则清楚地表明它完全可以用于解码URL。因此,使用URLDecoder更简单、更快速。我建议您取消对这个答案的删除标记。 - Lawrence Dol

7
根据文档所述,decode(String)已经被弃用,因为它总是使用平台默认编码,这通常是错误的。
请改用带有两个参数的版本。您需要指定在转义部分中使用的编码。

5

decode(String)方法已被弃用,应该使用decode(String, String)方法来显式设置字符编码以进行解码。


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相反的,并且应该被认为是一个bug。

这可能会误导那些试图使用对称于编码的方法的人。如在这篇文章中所指出的:“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()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接