java6中的URL解码

java6中的URL解码,java,Java,我发现java.net.urldecker.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中解码它?现在需要指定字符串的字符编码。根据页面上的信息: 注:万维网联盟 建议指出UTF-8 应该使用。不这样做可能会 引入不相容物 以下内容适用

我发现
java.net.urldecker.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中解码它?

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

注:万维网联盟 建议指出UTF-8 应该使用。不这样做可能会 引入不相容物

以下内容适用于您:

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

请参见下文。

如前所述,
解码(字符串)
被弃用,因为它总是使用平台默认编码,这通常是错误的


使用。您需要指定转义部分中使用的编码。

只有
解码(字符串)
方法不推荐使用。您应该使用
decode(String,String)
方法显式设置用于解码的字符编码。

您应该使用该方法,因为URLDecover类执行x-www-form-urlencoded解码,这是错误的(尽管名称不同,但它用于表单数据)。

如前面的海报所述,您应该使用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()));
这是在OracleJDK7中测试的。这不起作用的事实是违反直觉的,与JavaDocs相反,它应该被认为是一个bug

它可能会绊倒那些试图使用与编码对称的方法的人。例如,如本文所述:“,为了编码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()));

-这完全是错误的。文档中明确说明,此方法使用application/x-www-form-urlencoded,该方法仅用于查询字符串。-1请参阅我对@Draemon正确答案的评论。如果问题正确,这将是正确答案!如果正确使用了decode()的单参数版本,则应使用双参数版本。+1将用户引导到另一个答案。:)这个答案实际上是正确的,因为引用的表单编码遵从URL编码。媒体类型
application/x-www-form-urlencoded
指的是用于URL的编码,而
urldecker
指定的详细规则清楚地表明,它在解码URL时完全有效。因此,使用
URLDecoder
更简单,而且可能更快。我建议你不要重复这个答案。@谁投了反对票:想详细说明哪一部分是错的吗?这是正确的答案!这总是让人绊倒。URLEncoder/URLDecoder编码和解码URL的表单数据,而不是URL本身。URL类提供URL本身的编码和解码。URI类是一个更新的、更好指定的、更通用的API——每个URL字符串也是一个URI字符串,所以使用URI进行解析。URL类本身警告不要混淆URLEncoder/Decoder的使用:“也可以使用URLEncoder和URLDecoder类,但只能用于HTML表单编码,这与RFC2396中定义的编码方案不同。”java.net.URI.decode()现在是私有的媒体类型
application/x-www-form-urlencoded
指用于URL的编码,并且
urldecker
指定的详细规则清楚地表明,它完全适用于URL解码。因此,使用
urldecover
更简单,可能更快。urldecover将用“”替换“+”,这是不正确的。在查询字符串键和值中,只应将“+”更改为“”。