Я создаю XML-строку на лету (НЕ при чтении из файла). Затем я использую Cocoon 3, чтобы преобразовать его через FOP в PDF. Где-то посередине бежит Ксерс. Когда я использую жестко запрограммированные вещи, все работает. Как только я помещаю немецкий умлаут в базу данных и обогащаю свой 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/
Я не знаю, почему мой код не работает.
Затем я попытался добавить спецификацию вручную, вот так:
byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
Я знаю, что это не совсем хорошо, но я пробовал - конечно, не удалось. Я попытался добавить впереди xml-заголовок:
Что тоже не удалось. Потом совмещал. Не смогли.
В конце концов, я пробовал что-то вроде этого:
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
Фактически ничего не делает, потому что это уже UTF-8. Тем не менее это не удается.
Итак ... есть идеи, что я делаю неправильно и чего от меня ждет Ксерс?
Спасибо Christian