Creo una cadena XML sobre la marcha (NO leyendo desde un archivo). Luego uso Cocoon 3 para transformarlo a través de FOP a PDF. En algún lugar en el medio se ejecuta Xerces. Cuando uso las cosas codificadas, todo funciona. Tan pronto como pongo una diéresis alemán en la base de datos y enriquecer mi xml con esos datos me sale:Tengo UTF-8, pero aún obtengo "Byte no válido 1 de 1 byte secuencia UTF-8"
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)
Entonces he depurado mi aplicación y descubierto, mi "A" (que viene frome la base de datos) tiene el valor de byte de 196, que es C4 en hex. Esto es lo que esperaba de acuerdo con esto: http://www.utf8-zeichentabelle.de/
No sé por qué mi código falla.
entonces han tratado de añadir manualmente una lista de materiales, así:
byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
Sé que esto no es exactamente bueno, pero que lo probamos - por supuesto que no. He intentado añadir una cabecera XML delante:
<?xml version="1.0" encoding="UTF-8"?>
que fracasó también. Luego lo combiné. Ha fallado.
Después de todo he intentado algo así:
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
¿Qué está haciendo nada, de hecho, porque ya es UTF-8. Todavía falla.
Entonces ... ¿Alguna idea de lo que estoy haciendo mal y de lo que Xerces espera de mí?
Gracias Cristiano
Estoy de acuerdo, pero no me ayuda. Porque la Cadena problemática que proviene de la base de datos se crea desde mi capa ORM. Además, tiene 0xC4 que debería estar bien, ¿verdad? – Christian
Uso MySQL, la tabla y las columnas están codificadas con utf8_general_ci. He agregado useUnicode = true y characterEncoding = utf8 a mi conexión jdbc. – Christian
Puede que no sea una buena idea especificar esos parámetros en la conexión JDBC cuando te conectas a un DB con una codificación diferente; solo úsala cuando la autodetección no funcione. ¿Qué usas para escribir los datos, y es esto una columna BLOB o VARCHAR? – JBert