codificação de URL para caracteres latinos em Java
Pergunta
Eu estou tentando ler em um URL de imagem. Como mencionado na documentação do java, eu tentei converter a URL para URI por
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();
Tenho a uma Exceção Java.io.FileNotFound para o arquivo http://www.shefinds.com/files/Christian-Louboutin- DÃ © Colleta © -100-pumps.jpg
O que estou fazendo de errado eo que é o caminho certo para codificar esta URL?
Update:
Estou usando Roma para ler em feeds RSS. Tomando sugestões de BalusC I se imprimiu a entrada em bruto a partir de diferentes etapas e parece que a Roma rss analisador está a utilizar-ISO 8859-1 em vez de UTF-8.
Solução
funciona bem aqui (devolve um 403, é pelo menos não a 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();
Quando eu corrigi-lo para que ele não retorna um 403, a imagem é corretamente 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));
}
Assim, seus problema está em outro lugar. Convertendo realmente não é necessário. O URL inicial é válido.
Talvez você está obtendo o URL real de alguma fonte binário usando a codificação de caracteres errado? A transição de é
para é
nomeadamente sugere que a fonte original era UTF-8 codificado e que o código foi lido de forma incorrecta no usando ISO-8859-1 em vez de UTF-8.
Atualizar : ou talvez você realmente codificado no código-fonte Java e salvando o arquivo fonte própria usando a codificação errada. Eu configurei meu editor (Eclipse) para salvar arquivos usando UTF-8 eo -Dfile.encoding
também é padrão para UTF-8, isso explicaria por que ele funciona na minha máquina ;)
Update 2 : de acordo com as observações, em poucas palavras, tudo deve funcionar bem se a codificação usada para salvar o arquivo de origem corresponde ao -Dfile.encoding
padrão da plataforma de execução (e a codificação de caracteres em questão suporta a é
). Para evitar esses confrontos imprevistos sempre que quiser para distribuir o código, é realmente melhor para substituir caracteres não-ASCII hardcoded por escapes Unicode.
Outras dicas
Eu acho que a resposta técnica é "você não pode." caracteres não-ASCII não pode ser usado em uma URL de acordo com o padrão, e até mesmo alguns caracteres ASCII deve ser precedido com a sintaxe "% XX", onde XX é o valor ASCII do caractere.
Se alguma coisa, você pode escapar 'é' com '% E9', mas isso depende do servidor interpretar isso como uma codificação do personagem de acordo com ISO-8859-1. Enquanto isso não é tecnicamente permitido, eu acredito que muitos servidores irão fazê-lo.
A codificação do arquivo de origem é a culpa. Usando seu IDE, configurá-lo para UTF-8, e depois repaste o URL.