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");
Это должно это исправить