Кодировать и декодировать URL-адреса rfc2396
Каков наилучший способ кодирования строк URL-адресов, чтобы они соответствовали rfc2396, и декодирования строки, совместимой с rfc2396, чтобы, например,%20 заменялось пробелом?
редактирование: классы URLEncoder и URLDecoder не кодируют / декодируют URL-адреса, соответствующие rfc2396, они кодируют в MIME-тип приложения /x-www-form-urlencoded, который используется для кодирования данных параметров HTML-формы.
4 ответа
Используйте класс URI следующим образом:
URI uri = new URI("http", "//www.someurl.com/has spaces in url", null);
URL url = uri.toURL();
или если вы хотите строку:
String urlString = uri.toASCIIString();
Ваши составные части, потенциально содержащие символы, которые должны быть экранированы, должны быть уже экранированы с использованием URLEncoder до того, как они будут объединены в URI.
Если у вас есть URI с внеполосными символами (например, пробел, "<>[]{}\|^` и не-ASCII-байты), это на самом деле не URI. Вы можете попытаться исправить их с помощью %-экранирование их вручную, но это операция последнего исправления, а не стандартная форма кодирования. Это обычно необходимо, когда вы принимаете потенциально искаженные URI из пользовательского ввода, но это не стандартизированная операция, и я не Вы не знаете ни о какой встроенной функции библиотеки Java, которая сделает это за вас, вам, возможно, придется взломать что-то самостоятельно с помощью RegExp.
В другом направлении вы должны разбить ваш URI на отдельные части компонента (каждую отдельную часть пути, имя и значение параметра запроса и т. Д.), Прежде чем вы сможете удалить каждую часть (используя URLDecoder). Нет никакого разумного способа%-decode всего URI за один раз; Вы могли бы попытаться "декодировать%-экраны, которые не декодируют в разделители" (например, /?=&;%), но у вас осталась бы странная непоследовательная строка, которая не соответствует ни одному стандарту обработки URI.
URLEncoder / URLDecoder отлично подходит для обработки компонентов запроса URI, как имен, так и значений. Однако они не совсем подходят для обработки компонентов части пути URI. Разница в том, что символ "+" не означает пробел в части пути. Вы можете исправить это с помощью простой замены строки: после кодирования URLE замените '+' на '%20'; перед URLDecoding замените "+" на "%2B". Вы можете игнорировать разницу, если не планируете включать в свой путь сегменты, содержащие пробелы или плюсы.
Javadocs рекомендуют использовать класс java.net.URI для выполнения кодирования. Чтобы гарантировать, что класс URI правильно кодирует URL, необходимо использовать один из конструкторов с несколькими аргументами. Эти конструкторы выполнят требуемую кодировку, но потребуют, чтобы вы проанализировали любую строку URL в параметрах.
Если вы хотите декодировать, вы должны создать URI с помощью конструктора с одним аргументом, который не выполняет никакой кодировки. Затем вы можете вызвать такие методы, как getPath () и т. Д., Чтобы получить и построить декодированный URL-адрес.