Ответ 1
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();
}
Прежде чем вы сможете использовать эту процедуру, вы должны sanitize
указать свою строку, чтобы она представляла URL абсолютный. Я вижу два подхода к этому:
-
Гадание. Подготовьте
http://
к строке, если она уже не присутствует. -
Создайте URL из контекста, используя
new URL(URL context, String spec)