ChatGPT解决这个技术问题 Extra ChatGPT

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


K
Khal91

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

Java:字符串查询 = URLEncoder.encode("apples oranges", "utf-8");字符串 url = "http://stackoverflow.com/search?q=" + 查询;

Kotlin: val 查询: String = URLEncoder.encode("apples oranges", "utf-8") val url = "http://stackoverflow.com/search?q=$query"

或者,您可以使用不引发检查异常的 DroidParts 中的 Strings.urlEncode(String str)

或者使用类似的东西

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

如果整个 url 不可靠怎么办?我应该对协议以外的所有内容进行编码吗?我有点期待一种方便的方法来做到这一点。
然后它只是一个损坏的网址。这个想法是为了防止查询部分破坏 url。
@hgpc - 查看 RFC3986 (tools.ietf.org/html/rfc3986#section-3) 的第 3 部分。它告诉您如何对 URI 的各个部分进行编码。不幸的是,URI 的每个部分(主机、路径、查询等)的编码规则略有不同。
这很好,因为您只处理 URL 的特定部分并且您知道如何构造或重构 URL。有关可以处理任何 url 字符串的更通用的方法,请参阅下面的答案。
为什么我会收到弃用警告?改为使用 Uri.encode(query);
C
Craig B

我将在这里添加一个建议。您可以这样做,以避免必须获取任何外部库。

试试这个:

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 字符串并使其工作,而无需自己掌握任何特殊知识。


这应该是正确的答案。这是执行此操作的正式且明确的方法
在将 urlStr 发送到 URL 构造函数之前对其进行 urldecode 也是一个好主意。 URLDecoder.decode(urlStr)
确切的答案。非常感谢。你让我很开心
@berserk 如果它已经编码,请不要对其进行编码。你不应该进入它被部分编码的状态,或者你不确定它是否被编码。
此方法不会将 ğ 之类的字符编码为 %C4%9F。接受一个编码!
t
tanutapi

对于 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
@loentar 这是预期的结果。如果用户输入 a=1&b=1 作为查询,您希望准确地查询它。
这与 URLEncoder.encode(StringHere,"UTF-8") 有何不同
@stuckedoverflow 一方面, Uri.encode(str) 不像 URLEncoder.encode(str,"UTF-8") 那样抛出检查异常
J
Jedo

你也可以使用这个

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

这是最简单的方法


这不是最好的解决方案,但它绝对是一个不错的快速修复...thanx
当整个 URL 不可靠时,这是最快的解决方法。谢谢!
您确定应该允许 % 吗?它不应该被编码吗?
如何编码此 url 以便可以共享,然后用户能够打开链接并查看页面:yazd20.com//News/2015/11/استند-آب-كمدي-حسن-ريوندي-در-يزد.html
T
Thiago
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

E
Elango

您可以使用以下方法

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

第二个比第一个好。


A
Ali Jafari

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