我的Java独立应用程序从用户那里获得一个URL (指向一个文件),我需要点击它并下载它。我面临的问题是我不能正确地编码HTTP URL地址...
示例:
URL: http://search.barnesandnoble.com/booksearch/first book.pdf
java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");
返回给我:
http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf
但是,我想要的是
http://search.barnesandnoble.com/booksearch/first%20book.pdf
(空格替换为%20)
我猜URLEncoder
不是用来编码HTTP的.JavaDoc显示“用于HTML form编码的实用程序类”...有没有其他方法可以做到这一点?
发布于 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¶m2=that"
。这些参数就是您将使用URLEncoder
实现的功能。
以下两个示例突出显示了两者之间的差异。
下面的代码根据HTTP标准生成了错误的参数。注意:与号(&)和加号(+)的编码不正确。
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:)
以下代码将生成正确的参数,并对查询进行适当的编码。请注意空格、与号和加号。
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
发布于 2012-01-23 01:04:02
我将在这里添加一个针对Android用户的建议。您可以这样做,这样可以避免获取任何外部库。此外,上面一些答案中建议的所有搜索/替换字符解决方案都是危险的,应该避免。
试一试:
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字符串,并让它工作,而不需要你自己有任何特殊的知识。
发布于 2011-01-05 23:28:36
这是我开发的一个解决方案,比其他任何解决方案都更稳定:
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;
}
}
https://stackoverflow.com/questions/724043
复制相似问题