MalformedURLException, хотя я уже заменил пробелы на %20

String url = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins="+origin+"&destinations="+destination+"&mode=driving&sensor=false&language=en-EN&units=imperial";
url = url.replaceAll(" ", "%20");

Выход:

http://maps.googleapis.com/maps/api/distancematrix/xml?origins=150%20Sutter%20St%20San%20Francisco,%20CA,%20United%20States&destinations=1%20Palmer%20Sq%20E
Princeton,%20NJ%2008542&mode=driving&sensor=false&language=en-EN&units=imperial

Но я получаю сообщение об ошибке:

java.net.MalformedURLException: Illegal character in URL

Кто-нибудь может мне помочь..

Ответы

Ответ 1

(Примечание: см. Обновление ниже)

Используйте класс URLEncoder из пакета java.net. Пробелы не являются единственными символами, которые необходимо экранировать в URL-адресах, и URLEncoder обеспечит правильное кодирование всех символов, которые должны быть закодированы.

Вот небольшой пример:

String url = "http://...";
String encodedUrl = null;

try {
    encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException ignored) {
    // Can be safely ignored because UTF-8 is always supported
}

Обновить

Как указано в комментариях и других ответах на этот вопрос, класс URLEncoder безопасен только для кодирования параметров строки запроса URL-адреса. В настоящее время я полагаюсь на Guava UrlEscapers чтобы безопасно кодировать различные части URL.

Ответ 2

Вы не должны вызывать String.replaceAll для кодирования URL, вместо этого вы должны использовать java.net.URLEncoder.encode(String s, String enc).

Обратите внимание, что вам нужно только кодировать параметры строки запроса (имя и значение), а не весь URL.

При кодировании строки с использованием java.net.URLEncoder.encode(String s, String enc) применяются следующие правила:

  • Буквенно-цифровые символы "a" - "z", "A" - "Z" и "0", через "9" остаются неизменными.
  • Специальные символы ".", "-", "*" и "_" остаются неизменными.
  • Символ пробела "преобразуется в знак плюса" +".
  • Все остальные символы небезопасны и сначала преобразуются в один или больше байтов, используя некоторую схему кодирования. Тогда каждый байт представленный 3-символьной строкой "% xy", где xy - это двухзначное шестнадцатеричное представление байта. Рекомендуемой схемой кодирования для использования является UTF-8. Однако, по соображениям совместимости, если кодировка не указана, то по умолчанию кодировка платформа.

См. URLEncoder

Пример:

String url = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins=" + URLEncoder.encode(origin, "UTF-8");

Ответ 3

Вот ответ, который мне помог: Кодирование URL-адреса HTTP в Java

Он просто использует объекты URL и URI.

Первоначальный aproach, упомянутый выше в этом потоке с URLEncoder, закодировал все символы в URL-адресе, включая http://, и использование такого URL выбрасывало exception в httpConnection - следовательно, это не очень хороший вариант. Теперь я использую подход URL/URI, упомянутый в ссылке, и работает как ожидалось.

Ответ 4

java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20")); имеют хороший день =).

Ответ 5

Пытаться

str.replaceAll("\\s","%20");

Это должно это исправить