我动态创建了一个XML字符串(而不是从文件中读取)。然后我使用Cocoon 3通过FOP将其转换为PDF。在中间某个地方Xerces运行。当我使用硬编码的内容时,一切正常。但是,一旦我将德语Umlaut放入数据库并用该数据丰富我的XML,就会出现以下错误:
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)
我已经调试了我的应用程序并发现,我的“Ä”(来自数据库)的字节值为196,即十六进制中的C4。根据这个网站:http://www.utf8-zeichentabelle.de/,这正是我所期望的。
我不知道为什么我的代码失败了。
然后我尝试手动添加 BOM,像这样:
byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
我知道这并不是特别好的方法,但我尝试了一下 — 当然失败了。我试图在前面添加一个XML头:
<?xml version="1.0" encoding="UTF-8"?>
之前我尝试了一个方法,但是失败了。然后我把它和另一个方法结合起来,仍然失败。
最后我尝试了这样一种方法:
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
实际上这并没有做任何事情,因为它已经是UTF-8格式了,但仍然失败了。
所以...你有什么想法我做错了什么,Xerces从我这里期望什么呢?
谢谢,Christian