Android中的url编码
如何在Android中对URL进行编码?
我以为是这样的:
final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8"); URL url = new URL(encodedURL);
如果我这样做, http://
在urlAsString
被urlAsString
中的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(); }
第二个比第一个好。