2010-03-14 3 views
0

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

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, я распечатал исходный ввод с разных этапов, и похоже, что rss-парсер ROME использует ISO-8859-1 вместо UTF-8.

+0

@sammichy: устранить * .java * проблемы с кодировкой исходного файла, используйте ASCII escapin при создании своей строки: * "...: //www.shefinds.com/files/Christian-Louboutin-D \ u00e9collet \ u00e9 -100-pumps.jpg "*. Обратите внимание, что 'é' становится '\ u00e9' в исходном файле * .java *. – SyntaxT3rr0r

+0

@sammichy: также то, что вы показали, не является сообщением об ошибке. Откуда вы это взяли и как вы напечатали его, чтобы знать, что это «...»//www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg"*? – SyntaxT3rr0r

+0

@sammichy: для чего это стоит: * .java * файлы не имеют связанных с ними метаданных, поэтому это большая боль, чтобы обнаружить их кодировку и сделать эту работу безупречно в смешанной среде Linux, OS X, Windows, различных средах IDE. Поэтому в моей компании, где я написал рекомендации, * .java * files * должен * быть ASCII-only, и это выполняется с помощью скриптов во время сборки. – SyntaxT3rr0r

ответ

3

Работает хорошо здесь (возвращает 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, изображение правильно retireved:

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, что бы объяснить, почему он работает на моей машине;)

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

+0

Малое добавление: если вам действительно нужно конвертировать из URI в URL-адрес, вы можете использовать: url = новый URI (url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null) .toURL(); В противном случае параметры запроса не будут работать. –

+0

Требуется преобразование. Учитывая это код, 'URL' будет кодировать'? 'вместо символов non-us-ascii. – axtavt

+0

URL-адрес для преобразования URI работает для меня; Из Javadoc: Обратите внимание, что класс {@link java.net.URI} выполняет определенные экраны своих полей при определенных обстоятельствах. Рекомендуемым способом для управления кодированием и расшифровкой URL-адресов является использование {@link java.net.URI}, и преобразование между этими двумя классами с помощью {@link #toURI()} и {@link URI # toURL()}. –

0

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

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

+0

@Sean Owen: * «где XX - это значение ASCII символа» * неверно: нет такой вещи, как символ ASCII выше 0x7F (ASCII переходит от 0 до 127). – SyntaxT3rr0r

+0

Не уверен, что я понимаю - значения ASCII варьируются от 0x00 до 0x7F, да. Их кодировки идут от% 00 до% 7F. Что связано с тем, что 0x80 не является символьным значением ASCII? –

0

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

Смежные вопросы