URL-Codierung für lateinische Zeichen in Java
Frage
Ich versuche, in einer Bild-URL zu lesen. Wie in der Java-Dokumentation erwähnt, habe ich versucht, die URL zu URI Umwandlung von
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();
Ich erhalte die eine Java.io.FileNotFound Ausnahme für Datei http://www.shefinds.com/files/Christian-Louboutin- DÃ © Colleta © -100-pumps.jpg
Was mache ich falsch und was ist der richtige Weg, um diese URL zu kodieren?
Update:
Ich bin mit Rom in RSS-Feeds zu lesen. Unter Vorschläge von BalusC Ich habe aus dem rohen Input von verschiedenen Stufen gedruckt und scheint, dass der ROM RSS-Parser mit ISO-8859-1 statt UTF-8.
Lösung
Adaequat hier (gibt ein 403, es ist zumindest kein 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();
Wenn ich das Problem beheben, so dass es keine 403 zurückkehrt, wird das Bild richtig 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));
}
So Ihr Problem woanders liegt. Konvertieren ist eigentlich nicht benötigt. Die ursprüngliche URL ist gültig.
Vielleicht sind Erhalten Sie die aktuelle URL von einem Binärquelle der falsche Zeichencodierung verwenden? Der Übergang von é
zu é
legt nahe, nämlich, dass die ursprüngliche Quelle UTF-8 codiert wurde und dass der Code wurde falsch eingelesen sich mit der ISO-8859-1 statt UTF-8.
Aktualisieren : oder vielleicht haben Sie es tatsächlich in der Java-Quellcode fest einprogrammiert und Speichern der Quelldatei selbst die falsche Codierung. Ich habe meine Editor (Eclipse) konfiguriert Dateien speichern UTF-8 verwenden und die -Dfile.encoding
auch auf UTF-8 vorbelegt ist, das würde erklären, warum es an meiner Maschine arbeitet ;)
Update 2 : wie pro den Kommentare, kurz gesagt, alles sollte gut funktionieren, wenn die Codierung speichern verwendet, um die Quelldatei des Standard -Dfile.encoding
die Runtime-Plattform übereinstimmt (und die Zeichenkodierung in Frage unterstützt die é
). Um diese unvorhergesehenen Kollisionen zu vermeiden, wenn Sie den Code verteilen mögen, es ist in der Tat besser fest einprogrammiert Nicht-ASCII-Zeichen von Unicode-Fluchten zu ersetzen.
Andere Tipps
Ich denke, die technische Antwort „Sie können es nicht.“ Nicht-ASCII-Zeichen können nicht in einer URL verwendet werden, gemäß der Norm, und sogar einige ASCII-Zeichen müssen mit „% XX“ Syntax entwertet werden, wobei XX der ASCII-Wert des Zeichens ist.
Wenn überhaupt, können Sie entkommen ‚é‘ mit ‚% E9‘, aber dies beruht auf dem Server dies als eine Codierung des Zeichens gemäß ISO-8859-1 interpretiert. Während dies technisch nicht erlaubt, ich glaube, viele Server es tun werden.
Die Codierung der Quelldatei ist schuld. Verwenden Sie Ihre IDE, setzen Sie ihn auf UTF-8, und dann die URL repaste.