HTTP URL-адрес кодирования в Java - PullRequest
350 голосов
/ 07 апреля 2009

Мое автономное Java-приложение получает от пользователя URL-адрес (который указывает на файл), и мне нужно нажать его и загрузить. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу правильно закодировать URL-адрес HTTP ...

Пример:

URL:  http://search.barnesandnoble.com/booksearch/first book.pdf

java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");

возвращает меня:

http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf

Но я хочу

http://search.barnesandnoble.com/booksearch/first%20book.pdf

(пробел заменен на% 20)

Полагаю, URLEncoder не предназначен для кодирования URL-адресов HTTP ... JavaDoc сообщает "Класс служебных программ для кодирования форм HTML" ... Есть ли другой способ сделать это?

Ответы [ 24 ]

0 голосов
/ 03 апреля 2017

У меня была такая же проблема. Решил это с помощью unsing:

android.net.Uri.encode(urlString, ":/");

Кодирует строку, но пропускает ":" и "/".

.
0 голосов
/ 15 января 2011

Я создал новый проект, чтобы помочь создать URL-адреса HTTP. Библиотека автоматически кодирует URL-адреса сегментов пути и параметров запроса.

Вы можете просмотреть исходный код и загрузить двоичный файл по адресу https://github.com/Widen/urlbuilder

Пример URL в этом вопросе:

new UrlBuilder("search.barnesandnoble.com", "booksearch/first book.pdf").toString()

производит

http://search.barnesandnoble.com/booksearch/first%20book.pdf

0 голосов
/ 18 марта 2014

Я разрабатываю библиотеку, которая служит этой цели: galimatias . Он анализирует URL так же, как веб-браузеры. То есть, если URL работает в браузере, он будет правильно проанализирован по galimatias .

В этом случае:

// Parse
io.mola.galimatias.URL.parse(
    "http://search.barnesandnoble.com/booksearch/first book.pdf"
).toString()

Даст вам: http://search.barnesandnoble.com/booksearch/first%20book.pdf. Конечно, это самый простой случай, но он будет работать с чем угодно, даже за пределами java.net.URI.

Вы можете проверить это по адресу: https://github.com/smola/galimatias

0 голосов
/ 23 августа 2014

Вы можете использовать такую ​​функцию. Заполните и измените его по своему усмотрению:

/**
     * Encode URL (except :, /, ?, &, =, ... characters)
     * @param url to encode
     * @param encodingCharset url encoding charset
     * @return encoded URL
     * @throws UnsupportedEncodingException
     */
    public static String encodeUrl (String url, String encodingCharset) throws UnsupportedEncodingException{
            return new URLCodec().encode(url, encodingCharset).replace("%3A", ":").replace("%2F", "/").replace("%3F", "?").replace("%3D", "=").replace("%26", "&");
    }

Пример использования:

String urlToEncode = ""http://www.growup.com/folder/intérieur-à_vendre?o=4";
Utils.encodeUrl (urlToEncode , "UTF-8")

Результат: http://www.growup.com/folder/int%C3%A9rieur-%C3%A0_vendre?o=4

...