Answers:
您无需对整个URL进行编码,而仅对其中一部分来自“不可靠的来源”进行编码。
String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
另外,您可以使用不引发检查异常的DroidParts的Strings.urlEncode(String str)。
或使用类似
String uri = Uri.parse("http://...")
.buildUpon()
.appendQueryParameter("key", "val")
.build().toString();
Uri.encode(query);
来代替。
我将在这里添加一个建议。您可以这样做,避免了必须获取任何外部库的情况。
试试看:
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,我将使用String android.net.Uri.encode(String s)
使用UTF-8方案将给定字符串中的字符编码为'%'转义的八位字节。保留字母(“ AZ”,“ az”),数字(“ 0-9”)和未保留的字符(“ _- !.〜'()*”)完整无缺。编码所有其他字符。
例/
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
Uri.encode("a=1&b=1")
产生了a%3D1%26b%3D1
但是期望了a=1&b=1
a=1&b=1
为查询,则您要查询准确。
你也可以用这个
private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
这是最简单的方法
您可以使用以下方法
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;