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

Vereinbart, aber es hilft mir nicht. Weil die problematische String kommt aus der Datenbank erstellt wird, aus meiner ORM-layer. Darüber hinaus hat es 0xC4, die sollten das gut machen, richtig?
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

Schreibe einen Kommentar