Как кодировать URL-адрес, чтобы избежать специальных символов в java
Мне нужно java-код для кодирования URL-адреса, чтобы избежать специальных символов, таких как пробелы и% и... и т.д.
Ответы
Ответ 1
Конструкция URL-адресов сложна, потому что разные части URL-адреса имеют разные правила, для которых разрешены символы: например, знак плюса зарезервирован в компоненте запроса URL-адреса, поскольку он представляет собой пробел, но в компоненте пути URL, знак плюса не имеет специального значения, а пробелы кодируются как "%20".
RFC 2396 объясняет (в разделе 2.4.2), что полный URL-адрес всегда находится в его закодированной форме: вы берете строки для отдельных компоненты (схема, полномочия, путь и т.д.), кодируют каждый в соответствии со своими собственными правилами и затем объединяют их в полную строку URL. Попытка создать полную строку некодированного URL-адреса и затем закодировать ее отдельно приводит к тонким ошибкам, например, пробелы в пути, которые неправильно изменены на знаки плюс (которые RFC-совместимый сервер будет интерпретировать как реальные плюс, а не закодированные пробелы).
В Java правильный способ создания URL-адреса состоит из класса URI
. Используйте один из конструкторов с несколькими аргументами, который переносит компоненты URL как отдельные строки, и он будет автоматически удалять каждый компонент в соответствии с этими правилами компонентов. Метод toASCIIString()
дает вам правильно экранированную и закодированную строку, которую вы можете отправить на сервер. Чтобы декодировать URL-адрес, постройте объект URI
с использованием конструктора с одной строкой, а затем используйте методы доступа (например, getPath()
) для извлечения декодированных компонентов.
Не используйте класс URLEncoder
! Несмотря на название, этот класс фактически кодирует HTML-форму, а не кодировку URL. Неправильно конкатенация незакодированных строк, чтобы создать "незакодированный" URL-адрес, а затем передать его через URLEncoder
. Это приведет к проблемам (в частности, упомянутой выше в отношении пробелов и знаков плюс на пути).
Ответ 2
Это дубликат данного вопроса. Вы можете найти более подробную информацию и обсудить эту проблему по указанному ниже вопросу.
Кодировка URL-адреса HTTP в Java
public class URLParamEncoder {
public static String encode(String input) {
StringBuilder resultStr = new StringBuilder();
for (char ch : input.toCharArray()) {
if (isUnsafe(ch)) {
resultStr.append('%');
resultStr.append(toHex(ch / 16));
resultStr.append(toHex(ch % 16));
} else {
resultStr.append(ch);
}
}
return resultStr.toString();
}
private static char toHex(int ch) {
return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnsafe(char ch) {
if (ch > 128 || ch < 0)
return true;
return " %$&+,/:;[email protected]<>#%".indexOf(ch) >= 0;
}
}
Ответ 3
Если вы не хотите делать это вручную, используйте Apache Commons - Codec. Класс, на который вы смотрите: org.apache.commons.codec.net.URLCodec
String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
Ответ 4
Я бы повторил, что Wyzard написал, но добавьте, что:
- для параметров запроса, HTML-кодирование часто совпадает с тем, что ожидает сервер; вне их, правильно, что
URLEncoder
не следует использовать
- самая последняя спецификация URI RFC 3986, поэтому вы должны ссылаться на это как на первичный источник
Я написал сообщение в блоге некоторое время назад по этому вопросу: Java: безопасная обработка символов и построение URL
Ответ 5
Сималярный вопрос можно найти здесь:
Кодировка URL-адреса HTTP в Java
Ответ 6
Вот мое решение, которое довольно легко:
Вместо кодирования самого url я кодировал параметры, которые я проходил, потому что параметр был введен пользователем, и пользователь мог ввести любую неожиданную строку специальных символов, чтобы это сработало для меня отлично:)
String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/
try {
review = URLEncoder.encode(review,"utf-8");
review = review.replace(" " , "+");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String URL = "www.test.com/test.php"+"?user_review="+review;