你如何编码 Android 中的网址?
我以为是这样的:
final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8"); URL url = new URL(encodedURL);
如果我这样做,urlAsString中的http://被encodedURL中的http%3A%2F%2F替换,然后当我使用 URL 时我得到java.net.MalformedURLException。
urlAsString
http://
encodedURL
http%3A%2F%2F
java.net.MalformedURLException
您不对整个 URL 进行编码,只对来自“不可靠来源”的部分内容进行编码。
String query = URLEncoder.encode("apples oranges", "utf-8"); String url = "http://stackoverflow.com/search?q=" + query;
或者,您可以使用不抛出已检查异常的Strings.urlEncode(String str) DroidParts。
或者使用类似的东西
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 分解为其正确的组件,因此您无需执行任何字符串 search/replace 工作。其次,当您通过组件而不是单个字符串构造 URI 时,此方法利用了正确转义组件的 URI 类功能。
这种方法的优点在于,您可以使用任何有效的 URL 字符串并使其工作,而无需您自己了解任何特殊知识。
对于 android,我会使用 String android.net.Uri.encode(String s)
使用 UTF-8 方案将给定字符串中的字符编码为'%'-escaped 八位字节。保留字母(“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(); }
第二个比第一个好。
6 回答
您不对整个 URL 进行编码,只对来自“不可靠来源”的部分内容进行编码。
或者,您可以使用不抛出已检查异常的Strings.urlEncode(String str) DroidParts。
或者使用类似的东西
我将在这里添加一个建议。您可以这样做,避免必须获得任何外部库。
尝试一下:
你可以看到,在这个特定的 URL 中,我需要对这些空间进行编码,以便我可以将它用于请求。
这利用了 Android 类中可用的一些功能。首先,URL 类可以将 url 分解为其正确的组件,因此您无需执行任何字符串 search/replace 工作。其次,当您通过组件而不是单个字符串构造 URI 时,此方法利用了正确转义组件的 URI 类功能。
这种方法的优点在于,您可以使用任何有效的 URL 字符串并使其工作,而无需您自己了解任何特殊知识。
对于 android,我会使用 String android.net.Uri.encode(String s)
防爆/
你也可以用它
这是最简单的方法
你可以使用以下方法
要么
第二个比第一个好。