URLEncoder
имеет очень вводящее в заблуждение имя.В соответствии с Javadocs используются параметры формы кодирования с использованием MIME-типа application/x-www-form-urlencoded
.
С учетом сказанного его можно использовать для кодирования, например, параметров запроса .Например, если параметр выглядит как &/?#
, его закодированный эквивалент можно использовать как:
String url = "http://host.com/?key=" + URLEncoder.encode("&/?#");
Если у вас нет таких особых потребностей, URL javadocs предлагает использовать new URI(..).toURL
, который выполняет кодирование URI в соответствии с RFC2396 .
Рекомендуемый способ управления кодированием и декодированием URL-адресов - использовать URI
Следующий пример
new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL();
дает результат http://host.com/path/?key=%7C%20?/%23ä#fragment
.Обратите внимание, как символы ?&/
не кодируются.
Для получения дополнительной информации см. Сообщения Кодировка URL-адреса HTTP в Java или , как кодировать URL-адрес, чтобы избежать использования специальных символов в java .
EDIT
Поскольку ваш ввод является строковым URL, использование одного из параметризованного конструктора URI
вам не поможет.Также вы не можете использовать new URI(strUrl)
напрямую, так как он не указывает параметры URL.
Итак, на этом этапе мы должны использовать трюк, чтобы получить то, что вы хотите:
public URL parseUrl(String s) throws Exception {
URL u = new URL(s);
return new URI(
u.getProtocol(),
u.getAuthority(),
u.getPath(),
u.getQuery(),
u.getRef()).
toURL();
}
Прежде чем вы сможете использовать эту подпрограмму, вы должны очистить вашу строку, чтобы убедиться, что она представляет абсолютный URL.Я вижу два подхода к этому:
Гадание.Добавьте http://
к строке, если она уже не присутствует.
Создайте URI из контекста, используя new URL(URL context, String spec)