Tôi tạo chuỗi XML ngay lập tức (KHÔNG đọc từ tệp). Sau đó, tôi sử dụng Cocoon 3 để chuyển đổi nó qua FOP sang PDF. Một nơi nào đó ở giữa Xerces chạy. Khi tôi sử dụng công cụ mã hóa mọi thứ hoạt động. Ngay sau khi tôi đặt một Umlaut Đức vào cơ sở dữ liệu và làm giàu xml của tôi với dữ liệu mà tôi nhận được:Tôi có UTF-8 - nhưng vẫn nhận được "byte không hợp lệ 1 của chuỗi UTF-8 1 byte"
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)
Tôi đã sau đó sửa lỗi ứng dụng của tôi và phát hiện ra, tôi "A" (mà đi kèm Frome cơ sở dữ liệu) có giá trị byte của 196, là C4 trong hex. Đây là những gì tôi đã mong đợi theo điều này: http://www.utf8-zeichentabelle.de/
Tôi không biết tại sao mã của tôi không thành công.
Tôi đã sau đó cố gắng thêm một BOM bằng tay, như thế:
byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
Tôi biết điều này là không chính xác tốt, nhưng tôi đã thử nó - tất nhiên nó thất bại. Tôi đã cố thêm tiêu đề xml vào trước:
<?xml version="1.0" encoding="UTF-8"?>
cũng không thành công. Sau đó, tôi kết hợp nó. Thất bại.
Sau khi tất cả tôi đã cố gắng một cái gì đó như thế:
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
Đó là không làm gì trong thực tế, bởi vì nó đã là UTF-8. Vẫn thất bại.
Vì vậy ... bất kỳ ý tưởng nào tôi đang làm sai và những gì Xerces mong đợi từ tôi?
Cảm ơn Christian
Đồng ý, nhưng nó không giúp tôi. Vì chuỗi có vấn đề xuất phát từ cơ sở dữ liệu được tạo từ lớp ORM của tôi. Ngoài ra, nó có 0xC4 mà nên làm tốt, phải không? – Christian
Tôi sử dụng MySQL, bảng và cột được mã hóa bằng utf8_general_ci. Tôi đã thêm useUnicode = true & characterEncoding = utf8 vào kết nối jdbc của tôi. – Christian
Nó có thể không phải là một ý tưởng tốt để xác định các tham số trên kết nối JDBC khi bạn xảy ra để kết nối với một DB với một mã hóa khác nhau - chỉ sử dụng nó khi tự động phát hiện sai. Bạn sử dụng gì để ghi dữ liệu và đây có phải là cột BLOB hoặc VARCHAR không? – JBert