Мое автономное приложение Java получает URL-адрес (который указывает на файл) от пользователя, и мне нужно нажать на него и загрузить. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу правильно закодировать URL-адрес HTTP...
Я думаю, URLEncoder не предназначен для кодирования URL-адресов HTTP... В JavaDoc написано "Служебный класс для кодирования форм HTML"... Есть ли какой-либо другой способ сделать это?
Переведено автоматически
Ответ 1
Класс java.net.URI может помочь; в документации по URL вы найдете
Обратите внимание, класс URI действительно выполняет экранирование полей своего компонента при определенных обстоятельствах. Рекомендуемый способ управлять кодировкой и декодированием URL-адресов - использовать URI
Используйте один из конструкторов с более чем одним аргументом, например:
(конструктор URI с одним аргументом НЕ экранирует недопустимые символы)
Приведенный выше код экранирует только недопустимые символы - он НЕ экранирует символы, отличные от ASCII (см. Комментарий фатиха). Метод toASCIIString может использоваться для получения строки, состоящей только из символов US-ASCII:
Пожалуйста, имейте в виду, что большинство приведенных выше ответов НЕВЕРНЫ.
Класс URLEncoder, несмотря на название, - это НЕ то, что здесь должно быть. Жаль, что Sun назвала этот класс так раздражающе. URLEncoder предназначено для передачи данных в виде параметров, а не для кодирования самого URL-адреса.
Другими словами, "http://search.barnesandnoble.com/booksearch/first book.pdf" это URL. Параметрами могут быть, например, "http://search.barnesandnoble.com/booksearch/first book.pdf?parameter1=this¶m2=that". Параметры - это то, для чего вы бы использовали URLEncoder.
Следующие два примера подчеркивают различия между ними.
Ниже приведены неправильные параметры в соответствии со стандартом HTTP. Обратите внимание, что амперсанд (&) и плюс (+) закодированы неправильно.
uri = newURI("http", null, "www.google.com", 80, "/help/me/book name+me/", "MY CRZY QUERY! +&+ :)", null);
Я собираюсь добавить здесь одно предложение, предназначенное для пользователей Android. Вы можете сделать это, чтобы избежать необходимости получать какие-либо внешние библиотеки. Кроме того, все решения для поиска / замены символов, предложенные в некоторых ответах выше, опасны, и их следует избегать.
Вы можете видеть, что в этом конкретном URL-адресе мне нужно закодировать эти пробелы, чтобы я мог использовать его для запроса.
Это использует преимущества пары функций, доступных вам в классах Android. Во-первых, класс URL может разбивать URL-адрес на соответствующие компоненты, поэтому вам не нужно выполнять какую-либо работу по поиску / замене строк. Во-вторых, этот подход использует преимущество функции класса URI для правильного экранирования компонентов, когда вы создаете URI через компоненты, а не из одной строки.
Прелесть этого подхода в том, что вы можете взять любую допустимую строку URL и заставить ее работать, не требуя от вас каких-либо специальных знаний о ней самостоятельно.
Ответ 4
решение, которое я разработал, гораздо более стабильное, чем любое другое: