Android中的URL编码

如何在Android中编码URL ?

我以为是这样的:

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

如果我这样做,urlAsString中的http://将被encodedURL中的http%3A%2F%2F所取代,然后当我使用URL时,我得到一个java.net.MalformedURLException

298968 次浏览

你不需要对整个URL进行编码,只需要对来自“不可靠来源”的部分进行编码。

  • < p > Java:

    String query = URLEncoder.encode("apples oranges", Charsets.UTF_8.name());
    String url = "http://stackoverflow.com/search?q=" + query;
    
  • < p >芬兰湾的科特林:

    val query: String = URLEncoder.encode("apples oranges", Charsets.UTF_8.name())
    val url = "http://stackoverflow.com/search?q=$query"
    

或者,你可以使用DroidParts字符串。urlEncode (String str),它不会抛出检查异常。

或者像这样

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

我想在这里补充一个建议。您可以这样做,从而避免获得任何外部库。

试一试:

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类中提供给你的几个功能。首先,URL类可以将URL分解为适当的组件,因此不需要进行任何字符串搜索/替换工作。其次,当您通过组件而不是从单个字符串构造URI时,这种方法利用了正确转义组件的URI类特性。

这种方法的美妙之处在于,您可以使用任何有效的url字符串并让它工作,而不需要您自己对它有任何特殊的了解。

对于android,我会使用 (字符串s)

使用UTF-8方案将给定字符串中的字符编码为'%'-转义字节。叶子字母(“a - z”、“a - z”),数字(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();
}

第二个比第一个好。

找到阿拉伯字符并将其替换为其UTF-8编码。 像这样:

for (int i = 0; i < urlAsString.length(); i++) {
if (urlAsString.charAt(i) > 255) {
urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
}
}
encodedURL = urlAsString;