utf-8-Dekodierung in java
Ich versuche, um Parameter von einer PHP middle tier auf einem java-backend, das versteht J2EE. Ich Schreibe die controller-code in Groovy. In gibt, bin ich versucht zu decodieren einige parameter, die wahrscheinlich enthalten internationale Zeichen.
Ich bin wirklich verwirrt über die Ergebnisse meiner Debuggen dieses problem so weit, daher wollte ich es mit Euch teilen in der Hoffnung, dass jemand in der Lage werden, die richtige interpretation meiner Ergebnisse.
Wegen meiner kleinen test, den parameter ich übergeben ist "déjeuner". Nur um sicher zu sein, System.aus.println("déjeuner") richtig, gibt mir:
déjeuner
in der Konsole
Nun folgenden sind die char - /dec-und hex-Werte der einzelnen Zeichen der original-Zeichenfolge:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
beachten Sie, dass die c3a9 Sequenz in UTF-8 ist der gewünschte Charakter: http://www.fileformat.info/info/unicode/char/00e9/index.htm
Nun, wenn ich versuche zu Lesen, dieser string als UTF-8-string, wie in stmt.getBytes("UTF-8"), ich plötzlich am Ende mit einem 11 Byte-Sequenz, wie folgt:
64 c3 83 c2 a9 6a 65 75 6e 65 72
in der Erwägung, dass stmt.getBytes("iso-8859-1") gibt mir 9 bytes:
64 c3 a9 6a 65 75 6e 65 72
Hinweis: die c3a9 Reihenfolge hier!
nun, wenn ich versuchen, zu konvertieren von UTF-8-Sequenz UTF-8, wie in
new String(stmt.getBytes("UTF-8"), "UTF-8");
Bekomme ich:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
Hinweis: die c3a9 Sequenz
während
new String(stmt.getBytes("iso-8859-1"), "UTF-8")
Ergebnisse in:
next char: d 100 64
next char: ? -23 e9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
Hinweis: die e9, die in utf-8 (ascii) ist wieder die 'é' Charakter, dass ich Sehnsucht nach.
Leider, in beiden Fällen bin ich am Ende mit einem richtigen string darstellen würde, wie die Zeichenkette "déjeuner". Seltsam genug, die byte-Sequenzen scheinen beide richtig, obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Umgang mit Strings, denken Sie immer daran:
byte
!=char
. Also in deinem ersten Beispiel, Sie haben diechar c3
, nicht diebyte c3
das ist ein großer Unterschied: Diebyte
würde ein Teil der UTF-8-Sequenz, sondern diechar
bereits Unicode ist. Also, wenn Sie konvertieren, auf UTF-8, das Unicode-Zeichenc3
muss derbyte
Sequenzc3 83
.Die Frage ist also: Wie hast du die Schnur? Es muss ein bug im code, die nicht richtig verarbeitet UTF-8-kodiert
byte
Sequenzen.Der Grund, warum
ISO-8859-1
in der Regel funktioniert ist, dass diese Codierung nicht ändernchar
mit einem code point < 256 (also alles, was zwischen 0 und 255), also UTF-8-kodiertbyte
Sequenzen nicht geändert werden.Ihrem letzten Beispiel ist auch falsch: Die
char e9
ist é inISO-8859-1
und Unicode. In UTF-8, es ist nicht gültig, da es nichtbyte
und da es diebyte c3
Präfix fehlt. Das heißt, es korrekt repräsentiert den Unicode-Zeichenfolge, die Sie suchen.Wenn Sie beginnen mit der Java-String, wo
"d\u00C3\u00A9jeuner".equals(stmt)
dann die Daten schon korrupt auf dieser Stufe.Java
char
ist kein Cchar
. Einchar
in Java ist 16 bit breit und implizit enthält UTF-16 - codierten Daten. Versuchen, zu speichern, anderen kodierten Daten in ein Java -char
/String-Typ ist nach ärger. Charakter Daten in anderer Codierung sollte sobyte
Daten.Wenn Sie beim Lesen der parameter mit Hilfe der servlet-API, dann ist es wahrscheinlich, dass die HTTP-Anforderung enthält inkonsistente oder Unzureichende Codierung von Informationen. Überprüfen Sie den Aufruf-code und HTTP-Header. Es ist wahrscheinlich, dass der client die Codierung der Daten als UTF-8, aber das servlet ist die Dekodierung als ISO-8859-1.
Bin ich ein sehr ähnliches problem, außer dass mein Formular verwendet "GET" - Anforderung nicht in einer "POST" - Anfrage.
So, meine URL ist sowas wie: http://localhost:4502/form.jsp?query=d%C3%A9jeuner
So sollte das HttpServletRequest UTF-8 decodieren der Anforderung param (die eindeutig ist es nicht), oder ist dies lediglich ein browser-Fehler, da der browser nicht alle Zeichen-encoding-header (was wiederum nicht viel Sinn, weil es die nicht tun, ist eine post-Anforderung). Hier ist der vollständige Satz von Kopf-und beachten Sie die %C3%A9 in der URL.
Diese problem das ich habe ist, dass ich tatsächlich kopiert und eingefügt die Abfrage in den browser-form und es falsch codiert es. Sowohl in chrome und firefox.
Nach einigen weiteren Untersuchung fand ich diese Antwort
Wie man UTF-8-arbeiten in Java-webapps?.
Es ist alles über die Einstellung URIEncoding="UTF-8" in der tomcat-connector.
Nun herauszufinden, wie diese in das CMS, die wir verwenden (CQ5/Day).
Ask Question
auf die Schaltfläche rechts oben. Sobald das getan ist, löschen Sie diese Geräusche, die zu diesem Thema als gut.