2011-06-01 75 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