jsp-utf-Kodierung
Ich habe eine harte Zeit, herauszufinden, wie dieses problem zu behandeln:
Ich bin der Entwicklung einer web-tool für eine italienische Universität, und ich habe die Anzeige der Wörter mit Akzenten (wie è, ù, ...); manchmal bekomme ich diese Worte aus einer PostgreSql-Tabelle (UTF8-kodiert), aber meistens habe ich zu Lesen, lange Passagen aus einer Datei. Diese Dateien sind als utf-8 kodiert xml und Displays gut in Smultron oder ein utf-8 editor (Sie erstellt wurden-parsing in python alten Dateien mit Personen wie è
anstelle von "è").
Schrieb ich eine java-Klasse, welche Ausschnitte der relevanten Bereiche aus der xml-Datei, die funktioniert wie folgt:
String s = parseText(filename, position)
wenn ich Schreibe, die zurückgegebene Zeichenfolge in einer Datei, sieht alles in Ordnung; das problem ist, dass wenn ich
out.write(s)
in der jsp-Seite, bekomme ich komische Zeichen. Übrigens, ich benutze
String s = getWordFromPostgresql(...)
out.write(s)
in der gleichen jsp und es zeigt "OK".
Irgendeinen Hinweis?
Dank
Nicola
Vielen Dank für Ihre Antwort, jedoch, dass die Richtlinie ist bereits in die Seite, aber es funktioniert nicht (eigentlich "funktioniert" es, aber nur für die Saiten, die ich von der Datenbank). Ich denke es ist etwas über das Lesen von den Dateien, aber ich kann es nicht verstehen ... Sie arbeiten in der "java", aber nicht im "jsp" (kann nicht denken über eine bessere Erklärung ...)
hier ist ein einfaches Beispiel extrahiert aus dem tatsächlichen code: die Methode zum Lesen der Dateien im Gegenzug eine Karte, von der Mark (ein Objekt, eine position im text) in einen String (mit dem text):
dies ist in der .jsp-Seite (mit der utf-Richtlinie zitiert, die in den posts oben)
//...
Map<Mark, String> map = TestoMarkParser.parseMarks(...);
out.write(map.get(m));
und das ist das Ergebnis:
"Fu pro√≤ cos√ uso il Genere Enharmonico, che quelli quali vi si esercitavano,"
wenn ich den gleichen code in einer java-Klasse, und ersetzen aus.schreiben mit System.aus.println, das Ergebnis ist dieses:
"Fu così però in uso il Genere Enharmonico, che quelli quali vi si esercitavano,"
Habe ich eine Analyse mit einem hex-editor, hier ist es:
original-string: "fu così però "
ò in xml-Datei:
C3 B2
ò wie gerendert aus.write() in der jsp-Datei:
E2 88 9A E2 89 A4
ò wie geschrieben, in die Datei über:
FileWriter w = new FileWriter(new File("out.txt"));
w.write(s); //s is the parsed string
w.close();
C3 B2
drucken der Werte der einzelnen Zeichen als int -
0: 70 = F
1: 117 = u
2: 32 =
3: 112 = p
4: 101 = e
5: 114 = r
6: 8730 = �
7: 8804 = �
8: 32 =
9: 99 = c
10: 111 = o
11: 115 = s
12: 8730 = �
13: 168 = �
14: 10 = `
- Dies ist die große Frage für UTF-8 und Java stackoverflow.com/questions/138948/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der jsp page-Direktive, sollten Sie versuchen Sie, Ihr content-type auf utf-8 festlegen, die pageEncoding auf utf-8 auch.
UTF-8 ist nicht Standard-content-Typ in jsp, und es gibt alle Arten von interessanten Problemen, die sich daraus ergeben. Das problem ist, dass der zugrunde liegende Datenstrom wird interpretiert als ISO-8859-1 stream standardmäßig. Wenn Sie das schreiben eines unicode-bytes, die zu diesem Strom, werden Sie interpretiert werden als ISO-8859-1. Ich finde, dass die Einstellung der Kodierung utf-8 ist die beste Lösung.
Bearbeiten:
Darüber hinaus string variable in java sollte immer unicode. So sollten Sie immer in der Lage sein zu sagen,
und finden Sie den richtigen Zeichensatz kommt in der Konsole-Fenster von Ihrem web-server (oder einfach nur stoppen, im debugger und prüfen). Ich vermute, dass Sie werden sehen, falsche Zeichen, wenn Sie dies tun, die führt mich zu glauben, Sie haben ein encoding-problem bei der Konstruktion der saite.
Habe ich einige internationale jsp ' s [die "speziellen" international (Bezug zu Deutsch) - Zeichen].
Einfügen dieser [und nur diese, ich.e: keine contentType-Richtlinie auch (das hat einen doppelten contentType Fehler)] an der Spitze von Ihnen bekam Sie zu speichern und Rendern richtig:
Diese Referenz [http://www.inter-locale.com/codeset1.jsp] half mir zu entdecken, dass.
Wo ist diese Methode definiert? Ich vermute, dass es Ihre eigene Methode, das öffnet die Datei und extrahiert einen bestimmten Teil der Daten. Irgendwo in diesem Prozess ist es die erste konvertiert die bytes in Zeichen, wohl mit der Standard-Codierung für Ihre JVM.
Wenn die Standard-Codierung Ihrer Laufenden JVM nicht mit der tatsächlichen Kodierung der Datei die du gehst, um falsche Zeichen in deinem string. Hinzu kommt, dass, wenn Sie Lesen Inhalte, die codiert ist in ein multi-byte-form (z.B. UTF-8), Ihre "position" kann der Punkt in der Mitte eines multi-byte-Codierung.
Wenn die Quell-Dateien werden in einem wohlgeformten XML -, werden Sie viel besser dran mit einem echten parser (wie baute man in der JDK) zu analysieren, da der parser die korrekte übersetzung von Byte zu Zeichen. Dann verwenden Sie einen XPath-Ausdruck, um die Werte abzurufen.
Wenn Sie haven ' T verwendet einen XML-parser in der Vergangenheit, hier sind zwei Dokumente, die ich schrieb auf analysieren und XPath.
Edit: eine Sache, die Sie möglicherweise hilfreich finden, drucken Sie sich die aktuellen Charakter-Werte in den string, mit so etwas wie die folgenden:
Sollte man wohl auch drucken Sie Ihre Standard-Zeichensatz, so dass Sie wissen, wie Sie jede Sequenz von bytes übersetzt Zeichen:
Und schließlich, überprüfen Sie die ausgelieferten Seite als raw-bytes, um genau zu sehen, was wird an den client zurückgegeben.
Edit #2: das Zeichen ò ist Unicode-Wert 00F2, das wäre dann UTF-8-codiert C3 B2. Diese beiden codes nicht entsprechen den Symbolen, die Sie zeigten, in Ihrer früheren Antwort.
Mehr über Unicode-Zeichen finden Sie in der code charts an Unicode.org.
Ich hatte auch das gleiche problem, alles ist "utf-8" und warum sehe ich
sinnlose Zeichen und das problem war in jsp
und es muss am Kopf der Seite.
und alles wird in Ordnung sein.