Ich habe UTF-8 - aber immer noch "Invalid byte 1 of 1-byte UTF-8 sequence"
Erstelle ich eine XML-Zeichenfolge, die auf das Fliegen (NICHT das Lesen aus einer Datei). Dann ich benutze Cocoon 3 zu verwandeln, der über FOP zu PDF. Irgendwo in der Mitte Xerces läuft. Wenn ich den hardcoded Sachen funktioniert auch alles. Sobald ich einen deutschen Umlaut in die Datenbank und bereichern meine xml mit, dass die Daten, die ich bekomme:
Caused by: org.apache.cocoon.pipeline.ProcessingException: Can't parse the XML string.
at org.apache.cocoon.sax.component.XMLGenerator$StringGenerator.execute(XMLGenerator.java:326)
at org.apache.cocoon.sax.component.XMLGenerator.execute(XMLGenerator.java:104)
at org.apache.cocoon.pipeline.AbstractPipeline.invokeStarter(AbstractPipeline.java:146)
at org.apache.cocoon.pipeline.AbstractPipeline.execute(AbstractPipeline.java:76)
at de.grobmeier.tab.webapp.modules.documents.InvoicePipeline.generateInvoice(InvoicePipeline.java:74)
... 87 more
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
Habe ich dann ausgetestet, meine app und fand heraus, dass mein "Ä" (das kommt aus der Datenbank) hat den byte-Wert von 196, die C4 in hex. Dies ist, was ich erwartet habe, nach diesem: http://www.utf8-zeichentabelle.de/
Ich weiß nicht, warum mein code nicht funktioniert.
Habe ich dann versucht, fügen Sie eine Stückliste manuell, so:
byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
Ich weiß, das ist nicht gerade gut, aber ich habe es versucht - natürlich ist es fehlgeschlagen. Ich habe versucht, um einen xml-header vor:
<?xml version="1.0" encoding="UTF-8"?>
Gescheitert zu sein. Dann habe ich es kombiniert. Fehlgeschlagen.
Nachdem ich versuchte etwas wie das:
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
Tut sich nichts in der Tat, denn es ist bereits UTF-8. Trotzdem scheitert er.
So... irgendwelche Ideen, was ich falsch mache und was Xerces ist von mir erwarten?
Dank
Christian
Ich benutze MySQL, Tabelle und Spalten codiert sind utf8_general_ci. Ich habe useUnicode=true&characterEncoding=utf8 meinem jdbc-Verbindung.
Es ist vielleicht nicht eine gute Idee sein, geben Sie diese Parameter auf die JDBC-Verbindung, wenn Sie passieren, um eine Verbindung zu einer DB mit einer anderen Codierung - nur verwenden, wenn die automatische Erkennung schief geht. Was benutzt du um die Daten zu schreiben, und dies ist ein BLOB-oder VARCHAR-Spalte?
Mein Werkzeug ist nicht so generisch, es wird nur eine Verbindung zur Datenbank mit encoding setzen. Außerdem hatte ich wirklich Probleme mit nicht angeben. Die Daten, die ich Schreibe, kommt von einer Webseite, die sich der UTF-8-codiert: <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> . Dann geht es direkt in den Federbeinen.
Ich habe inzwischen heraus gefunden, dass kann ich beweisen, dass ich zu 100% utf-8. Während der gesamten trial - /error-phase sah ich den string char in den debugger, die irgendwie mit 196, anstatt die tatsächlichen bytes. Jetzt habe ich festgestellt, die richtige Reihenfolge der bytes. Danke für Eure Kommentare, ich habe etwas gelernt über unicode/utf-8 nun. Anyway, mein problem war eigentlich in Cocoon 3, wo ich tun müssen, um neue XMLGenerator(xmlInput.getBytes("UTF-8"), "UTF-8"), statt nur geben Sie die Zeichenfolge.
InformationsquelleAutor Christian | 2011-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihre Datenbank enthält nur ein einzelnes byte mit dem Wert 0xC4), dann ist Sie nicht UTF-8-Codierung.
Dem Zeichen "LATIN CAPITAL LETTER A WITH DIAERESIS" hat einen code-point-Wert U+00C4, aber UTF-8 nicht codieren, dass in einem einzigen byte. Wenn Sie die Dritte Spalte "UTF-8 (hex.)" auf UTF8-zeichentabelle.de Sie werden sehen, dass UTF-8 kodiert, die als 0xC3 84 (zwei bytes).
Bitte Lesen Sie Joels Artikel "Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" für mehr info.
EDIT: Christian fand die Antwort selbst; stellte sich heraus, es war ein problem in der Cocoon-3 SAX-Komponente (ich denke, es ist die alpha 3-version). Es stellt sich heraus, dass, wenn Sie übergeben Sie ein XML als String in die
XMLGenerator
Klasse, etwas schief gehen wird, während SAX Parsen verursachen dieses Chaos.Ich blickte auf den code zu finden, das eigentliche problem in der Cocoon-stax:
Wie Sie sehen können, wird der Anruf
getBytes()
erstellen ein Byte-array mit der JRE Standard-Codierung, die dann scheitern zu analysieren. Dies ist, weil die XML-erklärt sich für UTF-8 in der Erwägung, dass die Daten jetzt in bytes wieder, und wahrscheinlich verwenden die Windows-codepage.Als workaround kann man die folgenden verwenden:
Löst die internen Aktionen (wie Christian fand heraus, durch das Experimentieren mit der API).
Habe ich ein Thema eröffnet in die Apache-bug-tracker.
EDIT 2: Das Problem ist behoben und wird in einer zukünftigen Version.
InformationsquelleAutor JBert
Den
C4
sehen Sie auf dieser Seite bezieht sich auf die unicode-code-point,U+00C4
. Die byte-Reihenfolge verwendet, um darzustellen, wie ein Codepunkt in UTF-8 ist NICHT"\xC4"
. Was Sie wollen ist, was in der UTF-8 (hex.) Spalte, nämlich"\xC3\x84"
.Daher Ihre Daten nicht in UTF-8.
Können Sie Lesen Sie darüber, wie die Daten in UTF-8 codiert hier.
InformationsquelleAutor Artefacto
Ich bin unter Windows 7 mit TextPad als ein text-editor zur manuellen Erstellung der xml-Daten-Datei. Ich war immer der
MalformedByteSequenceException
. Meine Skillung in der xml-Datei war im UTF-8. Nach stochern, fand ich, dass mein editor noch ein tool, "Werkzeug ... Convert to DOS". Das habe ich gemacht, wieder die Datei gespeichert haben, und die Ausnahme, ging Weg und mein code lief einwandfrei.Ich schaute dann auf die Standard-Kodierung für die Datei-Typ in meinem editor. Es war ASCII, obwohl, wenn ich änderte die xml-Codierung parameter in ASCII, hab ich eine andere
MalformedByteSequenceException
.Also auf Windows-Systeme, können Sie versuchen, halten Sie die xml-Codierung auf UTF-8, aber speichern Sie die Datei codiert DOS. Ich habe nicht dig alle weiteren, warum das funktioniert.
InformationsquelleAutor NeilW