Android中的URL编码

hpi*_*que 324 url android urlencode

你如何在Android中编码URL

我以为是这样的:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);
Run Code Online (Sandbox Code Playgroud)

如果我执行上述操作,则将http://in urlAsString替换为http%3A%2F%2Fin encodedURL,然后java.net.MalformedURLException在使用URL时获取 .

yan*_*nko 616

您不对整个URL进行编码,只对来自"不可靠来源"的部分内容进行编码.

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
Run Code Online (Sandbox Code Playgroud)

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

或者使用类似的东西

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

  • 为什么我会使用此收到弃用警告?使用`Uri.encode(query);`代替. (8认同)
  • 然后它只是一个破碎的网址.这个想法是为了防止查询部分破坏URL. (5认同)
  • @hgpc - 看一下RFC3986的第3部分(http://tools.ietf.org/html/rfc3986#section-3).它告诉您如何编码URI的各个部分.不幸的是,URI的每个部分(主机,路径,查询等)具有略微不同的编码规则. (5认同)
  • 这很好,你只是处理URL的特定部分,你知道如何构建或重建URL.有关可以处理任何url字符串的更一般方法,请参阅下面的答案. (2认同)

Cra*_*g B 162

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

尝试一下:

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();
Run Code Online (Sandbox Code Playgroud)

你可以看到,在这个特定的URL中,我需要对这些空间进行编码,以便我可以将它用于请求.

这利用了Android类中可用的一些功能.首先,URL类可以将url分解为其正确的组件,因此您无需进行任何字符串搜索/替换工作.其次,当您通过组件而不是单个字符串构造URI时,此方法利用了正确转义组件的URI类功能.

这种方法的优点在于,您可以使用任何有效的URL字符串并使其工作,而无需您自己了解任何特殊知识.

  • 这应该是正确的答案.这是正式而明确的方法 (19认同)
  • 在将URL发送到URL构造函数之前,urldecode urlStr也是一个好主意.URLDecoder.decode(urlStr) (3认同)
  • 此方法不会像ğ到%C4%9F那样编码字符.接受一个编码! (3认同)
  • @berserk如果已经编码,请不要对其进行编码.您不应该进入部分编码的状态,或者您不确定它是否编码. (2认同)

tan*_*api 68

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

将给定字符串中的字符编码为'%' - 使用UTF-8方案转义八位字节.保留字母("AZ","az"),数字("0-9")和未保留字符("_-!.〜'()*").对所有其他字符进行编码.

防爆/

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

  • @loentar这是预期的结果.如果用户输入"a = 1&b = 1"作为查询,则需要准确查询. (11认同)
  • 不幸的是`Uri.encode("a = 1&b = 1")`产生'%3D1%26b%3D1`但预期`a = 1&b = 1` (2认同)
  • 这与 URLEncoder.encode(StringHere,"UTF-8") 有什么不同 (2认同)

小智 50

你也可以用它

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

这是最简单的方法

  • 当整个URL不可靠时,这是最快的解决方案.谢谢! (4认同)