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