Кодировка URL-адреса латинских символов в Java
Вопрос
Я пытаюсь прочитать 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-адрес.