首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Java实现HTTP URL地址编码

用Java实现HTTP URL地址编码
EN

Stack Overflow用户
提问于 2009-04-07 03:28:23
回答 19查看 397.9K关注 0票数 383

我的Java独立应用程序从用户那里获得一个URL (指向一个文件),我需要点击它并下载它。我面临的问题是我不能正确地编码HTTP URL地址...

示例:

代码语言:javascript
复制
URL:  http://search.barnesandnoble.com/booksearch/first book.pdf

java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");

返回给我:

代码语言:javascript
复制
http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf

但是,我想要的是

代码语言:javascript
复制
http://search.barnesandnoble.com/booksearch/first%20book.pdf

(空格替换为%20)

我猜URLEncoder不是用来编码HTTP的.JavaDoc显示“用于HTML form编码的实用程序类”...有没有其他方法可以做到这一点?

EN

回答 19

Stack Overflow用户

发布于 2010-04-08 05:01:41

请注意,上面的大多数答案都是错误的。

尽管名为URLEncoder类,但它并不需要出现在这里。不幸的是,Sun对这个类的命名如此令人恼火。URLEncoder是用来作为参数传递数据的,而不是用来编码网址本身的。

换句话说,"http://search.barnesandnoble.com/booksearch/first book.pdf"就是网址。例如,参数可以是"http://search.barnesandnoble.com/booksearch/first book.pdf?parameter1=this&param2=that"。这些参数就是您将使用URLEncoder实现的功能。

以下两个示例突出显示了两者之间的差异。

下面的代码根据HTTP标准生成了错误的参数。注意:与号(&)和加号(+)的编码不正确。

代码语言:javascript
复制
uri = new URI("http", null, "www.google.com", 80, 
"/help/me/book name+me/", "MY CRZY QUERY! +&+ :)", null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY%20CRZY%20QUERY!%20+&+%20:)

以下代码将生成正确的参数,并对查询进行适当的编码。请注意空格、与号和加号。

代码语言:javascript
复制
uri = new URI("http", null, "www.google.com", 80, "/help/me/book name+me/", URLEncoder.encode("MY CRZY QUERY! +&+ :)", "UTF-8"), null);

// URI: http://www.google.com:80/help/me/book%20name+me/?MY+CRZY+QUERY%2521+%252B%2526%252B+%253A%2529
票数 95
EN

Stack Overflow用户

发布于 2012-01-23 01:04:02

我将在这里添加一个针对Android用户的建议。您可以这样做,这样可以避免获取任何外部库。此外,上面一些答案中建议的所有搜索/替换字符解决方案都是危险的,应该避免。

试一试:

代码语言:javascript
复制
String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();

您可以看到,在这个特定的URL中,我需要对这些空格进行编码,以便将其用于请求。

这利用了Android类中可用的几个特性。首先,URL类可以将url分解为适当的组件,因此您不需要执行任何字符串搜索/替换工作。其次,当您通过组件而不是从单个字符串构造URI时,此方法利用了正确转义组件的URI类功能。

这种方法的美妙之处在于,你可以获取任何有效的url字符串,并让它工作,而不需要你自己有任何特殊的知识。

票数 88
EN

Stack Overflow用户

发布于 2011-01-05 23:28:36

这是我开发的一个解决方案,比其他任何解决方案都更稳定:

代码语言:javascript
复制
public class URLParamEncoder {

    public static String encode(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isUnsafe(ch)) {
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));
            } else {
                resultStr.append(ch);
            }
        }
        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isUnsafe(char ch) {
        if (ch > 128 || ch < 0)
            return true;
        return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
    }

}
票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/724043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档