Android 中的 URL 编码

问题描述 投票:0回答:8

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

我以为是这样的:

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

如果我执行上述操作,

http://
中的
urlAsString
将被
http%3A%2F%2F
中的
encodedURL
替换,然后当我使用URL时我会得到一个
java.net.MalformedURLException

android url urlencode
8个回答
701
投票

您无需对整个 URL 进行编码,仅对来自“不可靠来源”的部分进行编码。

  • Java:

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

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

或者,您可以使用 DroidPartsStrings.urlEncode(String str) ,它不会抛出已检查的异常。

或者使用类似的东西

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

174
投票

我要在这里添加一项建议。 您可以这样做,从而避免获取任何外部库。

尝试一下:

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 字符串并让它工作,而无需您自己具备任何特殊知识。


86
投票

对于Android,我会使用 字符串 android.net.Uri.encode(String s)

使用 UTF-8 方案将给定字符串中的字符编码为“%”转义八位字节。保留字母(“A-Z”、“a-z”)、数字(“0-9”)和未保留字符(“_-!.~'()*”)。对所有其他字符进行编码。

前/

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

52
投票

你也可以用这个

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

这是最简单的方法


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

2
投票

您可以使用以下方法

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();
}

第二个比第一个好。


0
投票

找到阿拉伯字符并将其替换为其 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;

-1
投票

如果您想要为您的网站提供 seo 友好的 URL,那么您可以使用此模块 https://store.kbizsoft.com/prestashop-modules/seo-Friendly-clean-url

© www.soinside.com 2019 - 2024. All rights reserved.