MalformedURLException虽然我已经用%20替换了空格

时间:2014-06-15 12:39:07

标签: java url

String url = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="+origin+"&destinations="+destination+"&mode=driving&sensor=false&language=en-EN&units=imperial";
url = url.replaceAll(" ", "%20");

输出:

http://maps.googleapis.com/maps/api/distancematrix/xml?origins=150%20Sutter%20St%20San%20Francisco,%20CA,%20United%20States&destinations=1%20Palmer%20Sq%20E
Princeton,%20NJ%2008542&mode=driving&sensor=false&language=en-EN&units=imperial

但我收到一个错误说:

java.net.MalformedURLException: Illegal character in URL

有人可以帮助我......

5 个答案:

答案 0 :(得分:17)

(注:请参阅下面的更新)

使用java.net包中的URLEncoder类。空格不是唯一需要在网址中转义的字符,URLEncoder将确保所有需要编码的字符都已正确编码。

这是一个小例子:

String url = "http://...";
String encodedUrl = null;

try {
    encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException ignored) {
    // Can be safely ignored because UTF-8 is always supported
}

<强>更新

正如评论和此问题的其他答案所指出的,URLEncoder类只能安全地编码URL的查询字符串参数。我目前依靠Guava的UrlEscapers来安全地编码URL的不同部分。

答案 1 :(得分:11)

您不应该致电String.replaceAll来对网址进行编码,而应使用java.net.URLEncoder.encode(String s, String enc)

请注意,您只需要对查询字符串参数(名称和值)进行编码,而不是整个URL。

使用java.net.URLEncoder.encode(String s, String enc)对字符串进行编码时,以下规则适用:

  • 字母数字字符“a”到“z”,“A”到“Z”和“0” 通过“9”保持不变。
  • 特殊字符“。”,“ - ”,“*”和“_”保持不变。
  • 空格字符“”将转换为加号“+”。
  • 所有其他字符都不安全,首先转换为一个字符 或者使用某种编码方案的更多字节。那么每个字节都是 由3个字符的字符串“%xy”表示,其中xy是 字节的两位十六进制表示。建议使用的编码方案是UTF-8。但是,出于兼容性原因, 如果未指定编码,则为
    的默认编码 使用平台。

请参阅URLEncoder

例如:

String url = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins=" + URLEncoder.encode(origin, "UTF-8");

答案 2 :(得分:6)

以下是帮助我的答案:HTTP URL Address Encoding in Java

仅使用URL&amp; URI个对象。

此主题中使用URLEncoder提及的原始方法,对包含http://的网址中的所有字符进行编码,并使用此类urlexception投放到httpConnection中 - 因此它不是一个好的选择。我现在正在使用链接中提到的URL/URI方法,它正在按预期工作。

答案 3 :(得分:4)

java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));祝你有个美好的一天=)。

答案 4 :(得分:1)

尝试

str.replaceAll("\\s","%20");

那应该解决