UTF-8-Antwort bei servlet
Ich bin das Lesen der HTTP-Antwort aus einem Perl-Seite in ein Servlet wie diese:
public String getHTML(String urlToRead) {
URL url;
HttpURLConnection conn;
BufferedReader rd;
String line;
String result = "";
try {
url = new URL(urlToRead);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
while ((line = rd.readLine()) != null) {
byte [] b = line.getBytes();
result += new String(b, "UTF-8");
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
Bin ich anzeigen dieses Ergebnis mit diesem code:
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"), true);
try {
String query = request.getParameter("query");
String type = request.getParameter("type");
String res = getHTML(url);
out.write(res);
} finally {
out.close();
}
Aber die Antwort noch nicht als UTF-8 kodiert. Was mache ich falsch?
Vielen Dank im Voraus.
- In Ihrem PrintWriter, ist es möglich, dass "UTF8" nicht existiert, aber "UTF-8" zu tun?
- Ich habe versucht es zu ändern, ohne Erfolg (bearbeitet)
- Wie können Sie sagen, es ist nicht UTF-8?
- Welchen Beweis haben Sie, dass
urlToRead
zurückkehrt, dessen Inhalt in UTF-8? Als das, was Sie sind, vorausgesetzt, es ist. Und warum sind Sie konvertierenline
zubyte
s, wenn Sie bereits eineString
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rufen, um
line.getBytes()
sieht verdächtig aus. Sie sollten wahrscheinlich machen esline.getBytes("UTF-8")
wenn Sie sicher sind, dass das, was zurückgegeben wird, ist UTF-8 kodiert. Außerdem, ich bin nicht sicher, warum es ist sogar notwendig. Ein typischer Ansatz, um Daten aus einemBufferedReader
ist die Verwendung einesStringBuilder
weiter anfügen jederString
abgerufenreadLine
in Folge. Die Umwandlung hin und her zwischenString
undbyte[]
ist unnötig.Ändern
result
in eineStringBuilder
und tun Sie dies:StringBuilder
. Was haben Sie derzeit ist quälend langsam: stackoverflow.com/questions/15177987/...Hier ist, wo Sie brechen die Kette der Zeichen-Codierung conversions:
Vom String#getBytes() javadoc:
Und defaullt-Zeichensatz ist wohl nicht UTF-8.
Aber warum all die Umbauten in den ersten Platz? Lesen Sie einfach die raw-bytes von der Quelle und schreiben die raw-bytes, um die der Verbraucher. Es soll UTF-8 alle Weg.
Ich auch vor dem gleichen problem in einem anderen Szenario, aber tun Sie es einfach, ich glaube, es wird funktionieren:
in der while-Schleife:
In meinem Fall, muss ich hinzufügen, eine andere Konfiguration.
Vorher war ich Schreibe die Seite so:
Ich geändert: