Pregunta

Estoy tratando de leer en una URL de la imagen. Como se ha mencionado en la documentación de Java, he intentado convertir la URL para 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();

Me da la Java.io.FileNotFound una excepción para el archivo http://www.shefinds.com/files/Christian-Louboutin- DÃ © Colleta © -100-pumps.jpg

¿Qué estoy haciendo mal y lo que es el camino correcto para codificar esta URL?

Actualización:
Estoy usando Roma a leer en los canales RSS. Tomando las sugerencias de BalusC He impreso el la entrada bruta de diferentes etapas y que parece ser que el ROMA RSS analizador está utilizando la norma ISO-8859-1 en lugar de UTF-8.

¿Fue útil?

Solución

funciona bien aquí (devuelve un 403, que es por lo menos no un 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();

Cuando arreglo de modo que no devuelve un 403, la imagen está correctamente 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));
}

Así que el problema radica en otro lugar. En realidad no es necesaria la conversión. El URL inicial es válida.

Tal vez usted está obteniendo la URL real de una fuente binaria utilizando la codificación de caracteres mal? La transición de é a é a saber, sugiere que la fuente original de codificación UTF-8 y que el código ha leído incorrectamente en en el uso de la norma ISO-8859-1 en lugar de UTF-8.

Actualizar : o tal vez realmente has codificado en el código fuente de Java y guardar el archivo de origen en sí utilizando la codificación incorrecta. He configurado mi editor (Eclipse) para guardar archivos usando UTF-8 y la -Dfile.encoding también es por defecto a UTF-8, que explicaría por qué que trabaja en mi máquina ;)

Actualización 2 : según los comentarios, en pocas palabras, todo debería funcionar bien si la codificación utilizada para guardar el archivo de origen coincide con el -Dfile.encoding por defecto de la plataforma de ejecución (y la codificación de caracteres en cuestión apoya la é). Para evitar los choques imprevistos siempre que lo desee para distribuir el código, que es de hecho mejor para reemplazar caracteres no ASCII codificados por los escapes de Unicode.

Otros consejos

Creo que la respuesta técnica es "no se puede." Los caracteres no ASCII no se pueden utilizar en una URL de acuerdo a la norma, e incluso algunos caracteres ASCII deben escaparse con la sintaxis "% XX", donde XX es el valor ASCII del carácter.

En todo caso, se puede escapar 'E' con '% E9' pero esto se basa en el servidor de interpretar esto como una codificación del carácter de acuerdo a la norma ISO-8859-1. Si bien esto no está permitido técnicamente, creo que muchos servidores harán.

La codificación del archivo fuente es el culpable. Utilizando su IDE, ponerlo en UTF-8, y luego pegar cualquier URL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top