URL-адрес Java-кодировки

Как я могу кодировать динамические значения String для создания экземпляров URL? Мне нужно заменить пробелы на %20, акценты, символы, отличные от ASCII...? Я попытался использовать URLEncoder, но он также кодирует символ "/", и если я передам строку, закодированную с помощью URLEncoder, в конструктор URL-адресов, я получаю MalformedURLException (нет протокола).

Ответ 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)

Ответ 2

Итак, вы говорите, что хотите кодировать часть своего URL-адреса, но не все. Звучит так, как будто вам придется разбить его на части, передать те, которые вы хотите закодировать через кодер, и снова собрать их, чтобы получить весь URL.