Как закодировать арабские слова в Url [duplicate]

Это не поможет для прерывистых проблем, но может быть полезно для других людей с аналогичной проблемой.

Я клонировал виртуальную машину и запустил ее в другой сети с новым IP-адресом, но не изменил привязки в IIS. Fiddler показывал мне «Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом», и IE сказал мне «Включите TLS 1.0, TLS 1.1 и TLS 1.2 в дополнительных настройках». Изменение привязки к новому IP-адресу решило его для меня.

295
задан Peter Mortensen 25 May 2015 в 19:39
поделиться

7 ответов

Вы не кодируете весь 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();
579
ответ дан JJD 22 August 2018 в 19:42
поделиться
  • 1
    Что делать, если весь URL-адрес ненадежен? Должен ли я кодировать все, кроме протокола? Я вроде как ожидал удобный метод для этого. – hpique 20 July 2010 в 01:28
  • 2
    Тогда это просто сломанный URL. Идея состоит в том, чтобы не допустить, чтобы часть запроса нарушила URL. – yanchenko 20 July 2010 в 01:37
  • 3
    @hgpc - посмотрите раздел 3 RFC3986 ( tools.ietf.org/html/rfc3986#section-3 ). Он рассказывает вам, как кодировать различные части URI. К сожалению, каждая часть URI (хост, путь, запрос и т. Д.) Имеет несколько иные правила кодирования. – D.Shawley 20 July 2010 в 02:49
  • 4
    Это нормально, что вы имеете дело с определенной частью URL-адреса, и вы знаете, как создать или восстановить URL-адрес. Для более общего подхода, который может обрабатывать любую строку url, см. Мой ответ ниже. – Craig B 22 January 2012 в 19:08
  • 5
    Почему я получаю предупреждение об устаревании, используя это? Вместо этого используется Uri.encode(query);. – prasanthv 6 April 2014 в 17:13

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

Попробуйте:

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

155
ответ дан Craig B 22 August 2018 в 19:42
поделиться
  • 1
    Это должен быть правильный ответ. это формальный и понятный способ сделать это – Asanka Senavirathna 29 August 2012 в 13:27
  • 2
    Это также может быть хорошей идеей для url-кода urlStr перед отправкой его в конструктор URL. URLDecoder.decode (urlStr) – Jakob Eriksson 30 September 2012 в 12:31
  • 3
    Разумеется, это должен быть правильный ответ. – AB1209 12 October 2012 в 12:59
  • 4
    @berserk Если он уже закодирован, не кодируйте его. Вы не должны попадать в состояние, в котором оно частично закодировано, или вы не уверены, что оно закодировано или не закодировано. – user207421 17 January 2014 в 09:00
  • 5
    Этот метод не кодирует символы типа «%» к% C4% 9F. Принимается один кодирует! – Alexander Prokofyev 30 May 2015 в 15:11

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

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

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

1
ответ дан Elango 22 August 2018 в 19:42
поделиться

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

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

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

45
ответ дан Jedo 22 August 2018 в 19:42
поделиться
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
2
ответ дан Joolah 22 August 2018 в 19:42
поделиться

Убедитесь, что используйте try ... catch. Если это не так.

-4
ответ дан Nguyễn Ngọc Anh 22 August 2018 в 19:42
поделиться

Для android я бы использовал 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);
62
ответ дан tanutapi 22 August 2018 в 19:42
поделиться
  • 1
    К сожалению, Uri.encode("a=1&b=1") производит a%3D1%26b%3D1, но ожидает a=1&b=1 – loentar 23 April 2015 в 12:06
  • 2
    @loentar Это ожидаемый результат. Если пользователь вводит a=1&b=1 в качестве запроса, вы хотите запросить именно это. – Anubian Noob 21 August 2015 в 01:06
Другие вопросы по тегам:

Похожие вопросы: