Кодировка URL для латинских символов в Java - PullRequest
0 голосов
/ 14 марта 2010

Я пытаюсь прочитать изображение 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?

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

Ответы [ 3 ]

3 голосов
/ 14 марта 2010

Здесь отлично работает (возвращает 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 на экранированные символы Юникода.

0 голосов
/ 16 марта 2010

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

0 голосов
/ 14 марта 2010

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

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

...