Вопрос

Я пытаюсь прочитать URL-адрес изображения.Как упоминалось в документации Java, я попытался преобразовать URL-адрес в URI с помощью

String imageURL = "http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg";
URL url = new URL(imageURL);
url = new URI(url.getProtocol(), url.getHost(), url.getFile(), null).toURL();  
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();

Я получаю исключение Java.io.FileNotFound для файлаhttp://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg

Что я делаю не так и как правильно закодировать этот URL?

Обновлять:
Я использую Rome для чтения RSS-каналов.Приняв предложения от BalusC, я распечатал необработанные данные с разных этапов, и похоже, что RSS-парсер ROME использует ISO-8859-1 вместо UTF-8.

Это было полезно?

Решение

Здесь работает нормально (возвращает 403, по крайней мере, не 404):

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
InputStream input = connection.getInputStream();

Когда я исправлю это так, чтобы оно не возвращало 403, изображение удаляется правильно:

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/4.0");
InputStream input = connection.getInputStream();
OutputStream output = new FileOutputStream("/pic.jpg");
for (int data = 0; (data = input.read()) != -1;) {
    output.write(data));
}

Значит ваша проблема где-то в другом.Преобразование фактически не требуется.Исходный URL-адрес действителен.

Может быть, вы получаете фактический URL-адрес из какого-то двоичного источника, используя неправильную кодировку символов?Переход é к é а именно, предполагает, что исходный источник был в кодировке UTF-8 и что код неправильно прочитал его при использовании ISO-8859-1 вместо UTF-8.

Обновлять:или, может быть, вы на самом деле жестко запрограммировали его в исходном коде Java и сохранили сам исходный файл, используя неправильную кодировку.Я настроил свой редактор (Eclipse) для сохранения файлов с использованием UTF-8 и -Dfile.encoding по умолчанию также используется UTF-8, это объясняет, почему это работает на моей машине ;)

Обновление 2:в двух словах, судя по комментариям, все должно работать нормально, если кодировка, используемая для сохранения исходного файла, соответствует кодировке по умолчанию. -Dfile.encoding платформы времени выполнения (и рассматриваемая кодировка символов поддерживает é).Чтобы избежать этих непредвиденных конфликтов всякий раз, когда вы хотите распространять код, действительно лучше заменить жестко запрограммированные символы, не входящие в ASCII, экранированием Юникода.

Другие советы

Я думаю, что технический ответ: «Вы не можете». Символы, не являющиеся ASCII, не могут использоваться в URL в соответствии со стандартом, и даже некоторые символы ASCII должны быть сбежаны с помощью синтаксиса «%XX», где xx-значение ASCII персонажа.

Во всяком случае, вы можете экранировать «é» с помощью «%E9», но это зависит от того, что сервер интерпретирует это как кодировку символа в соответствии с ISO-8859-1.Хотя это технически не разрешено, я считаю, что многие серверы это сделают.

Виновата кодировка вашего исходного файла.Используя свою IDE, установите для него значение UTF-8, а затем повторно вставьте URL-адрес.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top