Кодировка URL в Android - PullRequest
       1

Кодировка URL в Android

314 голосов
/ 20 июля 2010

Как вы кодируете URL в Android?

Я думал, что это так:

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

Если я сделаю выше, http://в urlAsString заменяется на http%3A%2F%2F в encodedURL, а затем я получаю java.net.MalformedURLException при использовании URL.

Ответы [ 6 ]

608 голосов
/ 20 июля 2010

Вы не кодируете весь 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();
163 голосов
/ 22 января 2012

Я собираюсь добавить одно предложение здесь. Вы можете сделать это, чтобы избежать необходимости получать какие-либо внешние библиотеки.

Дайте попробовать:

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-адреса и заставить ее работать, не требуя каких-либо специальных знаний о себе.

66 голосов
/ 04 июня 2013

для андроида я бы использовал String android.net.Uri.encode (String s)

Кодирует символы в заданной строке как «%» - экранированные октеты по схеме UTF-8. Оставляет буквы ("A-Z", "a-z"), цифры ("0-9") и незарезервированные символы ("_- !. ~ '() *") без изменений. Кодирует все остальные символы.

Ex /

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
48 голосов
/ 24 января 2014

Также вы можете использовать это

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

это самый простой метод

2 голосов
/ 30 января 2015
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
1 голос
/ 18 июня 2016

вы можете использовать ниже методы

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

второй лучше первого.

...