【问题标题】:URL Decode in Java 6 [duplicate]Java 6中的URL解码[重复]
【发布时间】: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


    【解决方案1】:

    您应该使用java.net.URI 来执行此操作,因为 URLDecoder 类执行 x-www-form-urlencoded 解码,这是错误的(尽管名称如此,但它用于表单数据)。

    【讨论】:

    • @whoever downvoted:请详细说明其中哪一部分是错误的?
    • 这是正确答案!这总是让人绊倒。 URLEncoder/URLDecoder URL 编码和解码表单数据,而不是 URL 本身。 URL 类提供 URL 本身的编码和解码。并且 URI 类是一个更新的、更明确的、更通用的 API——每个 URL 字符串也是一个 URI 字符串,所以使用 URI 来解析职责。 URL 类本身警告不要混淆 URLEncoder/Decoder 的使用:“也可以使用 URLEncoder 和 URLDecoder 类,但仅用于 HTML 表单编码,这与 RFC2396 中定义的编码方案不同。”
    • java.net.URI.decode() 现在是私有的
    • media-type application/x-www-form-urlencoded 指的是用于 URL 的编码,URLDecoder 指定的详细规则明确它完全适用于解码一个网址。所以使用URLDecoder 更简单,可能更快。
    • URLDecoder 会将“+”替换为“”,这是不正确的。 “+”只应在查询字符串键和值中改为“”。
    【解决方案2】:

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

    注意:万维网联盟 建议指出 UTF-8 应该使用。不这样做可能 引入不兼容的东西。

    以下内容应该适合您:

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

    请参阅下面的Draemon's answer

    【讨论】:

    • -1 这完全是错误的。文档明确指出,此方法使用 application/x-www-form-urlencoded ,仅用于查询字符串。
    • -1 在下面@Draemon 的正确答案上查看我的 cmets。
    • 如果问题正确,这将是正确答案!如果您正确使用了 decode() 的单参数版本,则应该使用双参数版本。
    • +1 用于将用户引导至其他答案。 :)
    • 这个答案实际上是正确的,因为引用的表单编码遵循 URL 编码。 media-type application/x-www-form-urlencoded 指的是用于 URL 的编码,URLDecoder 指定的详细规则清楚地表明它在解码 URL 时完全有效。所以使用URLDecoder 更简单,而且可能更快。我建议你取消这个答案。
    【解决方案3】:

    正如the documentation 所提到的,decode(String) 已被弃用,因为它始终使用平台默认编码,这通常是错误的。

    使用two-argument version instead。您需要指定转义部分使用的编码。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        正如之前的海报所指出的,您应该使用 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()));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-16
          • 2012-11-29
          • 2015-12-08
          相关资源
          最近更新 更多