Android中的url编码

如何在Android中对URL进行编码?

我以为是这样的:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8"); URL url = new URL(encodedURL); 

如果我这样做, http://urlAsStringurlAsString中的http%3A%2F%2F encodedURL ,然后我得到一个java.net.MalformedURLException当我使用的URL。

您不会对整个url进行编码,只会对来自“不可靠来源”的部分url进行编码。

 String query = URLEncoder.encode("apples oranges", "utf-8"); String url = "http://stackoverflow.com/search?q=" + query; 

或者,您可以使用DroidParts的 Strings.urlEncode(String str)不会抛出检查的exception。

或者使用类似的东西

 String uri = Uri.parse("http://...") .buildUpon() .appendQueryParameter("key", "val") .build().toString(); 

我要在这里添加一个build议。 你可以做到这一点,避免得到任何外部库。

试试这个:

 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类中的一些function。 首先,URL类可以将URL分解成适当的组件,因此不需要任何stringsearch/replace工作。 其次,当你通过组件构造一个URI而不是从一个单独的string时,这种方法利用了正确转义组件的URI类function。

这种方法的优点是,你可以采取任何有效的urlstring,并使其工作,而不需要你自己的任何特殊的知识。

对于android,我会使用stringandroid.net.Uri.encode(String s)

将给定string中的字符编码为'%' – 使用UTF-8scheme转义字节。 留下字母(“AZ”,“az”),数字(“0-9”)和无保留字符(“_- !.〜'()*”)。 编码所有其他字符。

防爆/

 String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query); 

你也可以使用这个

 private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS); 

这是最简单的方法

 try { query = URLEncoder.encode(query, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

你可以使用下面的方法

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

要么

 public String parseURL(String url, Map<String, String> params) { Builder builder = Uri.parse(url).buildUpon(); for (String key : params.keySet()) { builder.appendQueryParameter(key, params.get(key)); } return builder.build().toString(); } 

第二个比第一个好。