2011-06-01 45 views
12

如何编码动态字符串值以创建URL实例?我需要用%20,重音,非ASCII字符替换空格...? 我试图使用URLEncoder,但它也编码'/'字符,如果我给URLEncoder编码的字符串到URL构造函数,我得到一个MalformedURLException(没有协议)。Java - 编码URL

+4

请举一些例子说明字符串和你的代码从上下文构造URL。 – 2011-06-01 09:27:22

+0

不同的编码规则将适用于不同的[部分URI](http://illegalargumentexception.blogspot.com/2009/12/java-safe-character-handling-and-url.html#URI2009_ANATOMY)。正如Lukas所建议的那样,请提供您开始使用哪些信息以及想要结束的示例。 – McDowell 2011-06-01 10:45:13

回答

3

所以你说的是你想要编码你的URL的一部分,但不是整个事情。听起来像你不得不把它分解成部分,通过编码器传递你想要编码的那些,然后重新组装它以获得你的整个URL。

32

URLEncoder有一个很有误导性的的名字。它是根据Javadocs使用的编码格式参数使用MIME类型application/x-www-form-urlencoded

用这个说法它可以用于编码例如查询参数。例如,如果一个参数看起来像&/?#其编码相当于可以一起使用:

String url = "http://host.com/?key=" + URLEncoder.encode("&/?#"); 

除非你有URL javadocs建议使用new URI(..).toURL根据RFC2396执行URI编码的特殊需求。

推荐的方法来管理URL的编码和解码是使用URI

以下示例

new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL(); 

产生结果http://host.com/path/?key=%7C%20?/%23ä#fragment。请注意0​​等字符是如何编码的而不是

欲了解更多信息,请参阅文章HTTP URL Address Encoding in Javahow to encode URL to avoid special characters in java


编辑

由于您的输入是一个字符串的URL,使用URI的参数的构造函数的人会帮不了你。你也不能直接使用new URI(strUrl),因为它没有引用url参数。

所以在这个阶段,我们必须使用的手段来得到你想要的东西:

public URL parseUrl(String s) throws Exception { 
    URL u = new URL(s); 
    return new URI(
      u.getProtocol(), 
      u.getAuthority(), 
      u.getPath(), 
      u.getQuery(), 
      u.getRef()). 
      toURL(); 
} 

之前,你可以使用这个程序,你必须sanitize您的字符串,以确保它代表一个绝对 URL。我看到两种方法:

  1. 猜测。除非已经存在,否则将http://添加到字符串中。

  2. 使用new URL(URL context, String spec)

+1

URI uri = new URI(“www.google.com”); uri.toURL(); - >异常:“URI不是绝对的” – Arutha 2011-06-01 09:53:42

+3

这不是一个[有效的URI](http://www.ietf.org/rfc/rfc2396.txt)。请使用正确的*方案*,例如http。 – 2011-06-01 09:56:50

+0

我收到用户的字符串... – Arutha 2011-06-01 12:19:20