Кодировать и декодировать URL-адреса rfc2396

Каков наилучший способ кодирования строк URL, чтобы они соответствовали требованиям rfc2396 и декодировать строку, совместимую с rfc2396, такую, что, например, %20 заменяется символом пробела?

изменить: Классы URLEncoder и URLDecoder выполняют не кодирование/декодирование rfc2396-совместимых URL-адресов, они кодируют MIME-тип приложения /x -www-form-urlencoded, который используется для кодирования данных параметров формы HTML.

Ответ 1

Используйте класс URI следующим образом:

URI uri = new URI("http", "//www.someurl.com/has spaces in url", null);
URL url = uri.toURL();

или если требуется строка:

String urlString = uri.toASCIIString();

Ответ 2

Ваши компоненты, потенциально содержащие символы, которые должны быть экранированы, уже должны были экранироваться с использованием URLEncoder перед объединением в URI.

Если у вас есть URI с внеполосными символами (например, пробел, "< > [] {}\| ^` и байты без ASCII), это не действительно URI. исправить их вручную с помощью% -scaping, но это операция фиксации последней строки, а не стандартная форма кодирования. Это обычно необходимо, когда вы принимаете потенциально искаженные URI с пользовательского ввода, но это не стандартизованная и я не знаю никакой встроенной функции библиотеки Java, которая сделает это за вас, вам, возможно, придется что-то взломать с помощью RegExp.

В другом направлении вы должны разделить свой URI на его составные части (каждая отдельная часть пути, имя и значение параметра запроса и т.д.), прежде чем вы сможете отменить каждую часть (используя URLDecoder). Нет разумного способа% -декодировать весь URI за один раз; вы можете попробовать "декодировать% -качества, которые не декодируются в разделители (например,/? = &;%), но вам останется странная непоследовательная строка, которая не соответствует стандарту обработки URI.

URLEncoder/URLDecoder отлично подходит для обработки компонентов запроса URI, как имен, так и значений. Однако они не совсем подходят для обработки компонентов части пути URI. Разница в том, что символ "+" не означает пробел в части пути. Вы можете исправить это простой заменой строки: после URLEncoding замените '+ на' %20; перед URLDecoding замените '+ на'% 2B. Вы можете проигнорировать разницу, если вы не планируете включать в свой сегмент сегменты, содержащие пробелы или плюсы.

Ответ 3

javadocs рекомендует использовать класс java.net.URI для выполнения кодировки. Чтобы убедиться, что класс URI правильно кодирует URL-адрес, должен использоваться один из конструкторов с несколькими аргументами. Эти конструкторы будут выполнять требуемую кодировку, но вам потребуется проанализировать любую строку url в параметрах.

Если вы хотите декодировать, вы должны создать URI с единственным конструктором аргументов, который не делает никакой кодировки. Затем вы можете вызвать методы, такие как getPath() и т.д. Для извлечения и сборки декодированного URL.