Экранирование URL в Java - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующий URL, который я хочу экранировать:

http://BUCKET_ENDPOINT/PATH_1/PATH_2/PATH_3/PATH_4/PATH_5/TEST NAME COULD BE WITH & AND OTHER SPECIAL CHARS.zip

Я пока не нашел, как закодировать эту строку, чтобы она соответствовала как хранению в HTML, так и кодировке в виде URL, например '&'должен быть заменен на # 26, пробел должен быть заменен на # 20 и т. д.

URLEncoder в Java, например, заменит пробелы со знаком "+", а это не то, что я ищу

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку я уже знаю, что часть пути URL не нуждается в специальном экранировании, я решил воспользоваться предложенным решением здесь , чтобы кодировать только ту часть имени файла zip, которая отвечает потребности в этом случае

 String urlEscaped = URLEncoder.encode(URL_TO_ESCAPE, "UTF-8")
            .replaceAll("\+", "%20")
            .replaceAll("\%21", "!")
            .replaceAll("\%27", "'")
            .replaceAll("\%28", "(")
            .replaceAll("\%29", ")")
            .replaceAll("\%7E", "~");
0 голосов
/ 29 мая 2018

Я пока не нашел, как закодировать эту строку, чтобы она соответствовала как хранению в HTML, так и кодированию как URL

Это потому, что их нет, так как онидве отдельные вещи.

Печать в HTML обычно должна выполняться путем замены только ', ", <, > и & на &apos;,&quot;, &lt;, &gt; и &amp;.Вот примеры, делающие это: Рекомендуемый метод для экранирования HTML в Java , наиболее тривиальный и простой из возможных, так как

public static String encodeToHTML(String str) {
    return str
        .replace("'",  "&apos;")
        .replace("\"", "&quot;")
        .replace("<",  "&lt;")
        .replace(">",  "&gt;")
        .replace("&",  "&amp;");
}

Обратите внимание, что на вашей странице должен быть соответствующий набор символови помните, что если вы, например, печатаете URL-адрес в поле атрибута, требования будут немного другими.

Кодирование в виде URL-адреса позволяет значительно сократить список символов.Из документации URLEncoder :

Буквенно-цифровые символы от "a" до "z", от "A" до "Z" и от "0" до "9" остаются неизменными.

Специальные символы ".", "-", "*" и "_" остаются прежними.

Символ пробела "" преобразуется в знак плюс "+".

Все остальные символы небезопасны и сначала преобразуются в один или несколько байтов с использованием некоторой схемы кодирования.Затем каждый байт представлен 3-символьной строкой «% xy», где xy - это шестнадцатеричное представление байта из двух цифр.

Рекомендуемая схема кодирования - UTF-8.

Вы получите те с

String encoded = new java.net.URLEncoder.encode(url, "UTF-8");

Выше приведено кодирование формы HTML, которое близко к тому, что делает кодирование URL, с некоторыми заметными отличиями, наиболее актуальным из которых является + против %20.Для этого вы можете сделать это на выходе:

String encoded = encoded.replace("+", "%20");

Обратите внимание, что вы не хотите использовать кодировку URL для всего http://BUCKET_ENDPOINT/PATH_1/PATH_2/PATH_3/PATH_4/PATH_5/TEST NAME COULD BE WITH & AND OTHER SPECIAL CHARS.zip, но до последней его части, TEST NAME COULD BE WITH & AND OTHER SPECIAL CHARS.zipи отдельные сегменты пути, если они не являются фиксированными.

Если вы находитесь в положении, в котором вам нужно сгенерировать URL-адрес и , напечатайте его в формате HTML, сначала закодируйте его как URL-адрес,затем выполните html-экранирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...