Кодировать и декодировать URL-адреса rfc2396 - PullRequest
10 голосов
/ 20 ноября 2008

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

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

Ответы [ 4 ]

12 голосов
/ 23 февраля 2009

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

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

или если вы хотите строку:

String urlString = uri.toASCIIString();
2 голосов
/ 20 ноября 2008

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

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

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

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

1 голос
/ 20 ноября 2008

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

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

0 голосов
/ 20 ноября 2008

Использовать java.net.URLEncoder и java.net.URLDecoder .

...