Как кодировать 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

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