Неверная кодировка URL для изображений

В моем приложении есть ImageView, который отображает изображение с URL-адреса.

Я загружаю изображение, используя этот метод:

        Bitmap bitmap=null;
        URL imageUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setInstanceFollowRedirects(true);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.CopyStream(is, os);
        os.close();
        bitmap = decodeFile(f);
        return bitmap;

Это работает только с URL-адресами, содержащими цифры или английские буквы, и не работает с любыми другими символами (например, пробелами):

Хороший URL: http://site.com/images/image.png

Неверный URL: http://site.com/images/image 1. png

Я попытался изменить кодировку URL-адреса (URLEncoder.encode), но он меняет весь URL-адрес (включая косые черты и т. Д.).

Нужно ли заменять некоторые символы после кодирования? или может есть способ лучше?

Спасибо :)


person eviabs    schedule 10.11.2012    source источник


Ответы (1)


"Кодировка URL в Android"

Вы не кодируете весь URL-адрес, а только те его части, которые поступают из «ненадежных источников». -янченко

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "https://stackoverflow.com/search?q=" + query;

Это нормально, если вы имеете дело только с определенной частью URL-адреса и знаете, как построить или реконструировать URL-адрес. Для более общего подхода, который может обрабатывать любую строку URL, см. Мой ответ ниже. - Крейг Б.

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
person 1O1    schedule 10.11.2012
comment
Спасибо! :) но есть небольшая проблема: он не работает с еврейскими символами. Что я должен делать? - person eviabs; 10.11.2012
comment
Я думаю, вам нужно явно закодировать часть символов иврита, используя URLEncoder. Кажется, что URI обрабатывает только несколько символов, отличных от ASCII, см. раздел «Кодирование и декодирование компонентов URI» в здесь, а также проверьте эту ссылку - person 1O1; 10.11.2012
comment
вы используете URL-адрес или IRI (интернационализированный идентификатор ресурса)? - person 1O1; 10.11.2012
comment
В нем есть ивритские символы (site.com/images/עברית.png), так что это ИРИ, не так ли? Я сейчас немного в замешательстве... - person eviabs; 10.11.2012
comment
Это IRI, поэтому вам нужно перейти по этой ссылке. Также упоминается в документе по Android: хост, порт и схема URI. не подходят для кодирования и не должны содержать недопустимых символов. Поэтому возьмите часть, которая является ивритом, и закодируйте ее перед созданием URI. - person 1O1; 10.11.2012
comment
Как мне закодировать часть на иврите? URLEncoder.encode(hebrewPart, utf-8) не работает. - person eviabs; 10.11.2012
comment
попробуйте это... URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), URLEncoder.encode(url.getPath(), "utf-8"), url.getQuery(), url.getRef());, а также проверьте Android IDN для домена имена. - person 1O1; 11.11.2012