Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我有UTF-8,但仍然得到;1字节UTF-8序列的无效字节1“;_Java_Xml_Encoding_Utf 8_Xerces - Fatal编程技术网

Java 我有UTF-8,但仍然得到;1字节UTF-8序列的无效字节1“;

Java 我有UTF-8,但仍然得到;1字节UTF-8序列的无效字节1“;,java,xml,encoding,utf-8,xerces,Java,Xml,Encoding,Utf 8,Xerces,我动态创建一个XML字符串(而不是从文件中读取)。然后我使用Cocoon 3通过FOP将其转换为PDF。在中叶的某处跑步。当我使用硬编码的东西时,一切都正常。一旦我将一个德语Umlaut放入数据库并用这些数据丰富我的xml,我就会得到: Caused by: org.apache.cocoon.pipeline.ProcessingException: Can't parse the XML string. at org.apache.cocoon.sax.component.XMLGenera

我动态创建一个XML字符串(而不是从文件中读取)。然后我使用Cocoon 3通过FOP将其转换为PDF。在中叶的某处跑步。当我使用硬编码的东西时,一切都正常。一旦我将一个德语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。这就是我所期望的:

我不知道为什么我的代码失败

然后,我尝试手动添加BOM表,如下所示:

byte[] bom = new byte[3];
bom[0] = (byte) 0xEF;
bom[1] = (byte) 0xBB;
bom[2] = (byte) 0xBF;
String myString = new String(bom) + inputString;
xmlInput = new String(xmlInput.getBytes("UTF8"), "UTF8");
我知道这不太好,但我试过了——当然失败了。我尝试在前面添加一个xml头:

<?xml version="1.0" encoding="UTF-8"?>
实际上它什么也没做,因为它已经是UTF-8了。但它还是失败了

所以。。。你知道我做错了什么,Xerces对我的期望是什么吗

谢谢
Christian

您在该页面上看到的
C4
指的是unicode代码点,
U+00C4
。UTF-8中用于表示此类代码点的字节序列不是
“\xC4”
。您需要的是UTF-8(十六进制)列中的内容,即
“\xC3\x84”

因此,您的数据不在UTF-8中


您可以阅读有关数据如何在UTF-8中编码的信息。

如果您的数据库仅包含一个字节(值为0xC4),则您不使用UTF-8编码

字符“带分音符的拉丁文大写字母A”的代码点值为U+00C4,但UTF-8无法在单个字节中对其进行编码。如果您检查UTF8-zeichentabelle.de上的第三列“UTF-8(十六进制)”,您将看到UTF-8将其编码为0xC3 84(两个字节)

请阅读Joel的文章“”了解更多信息


编辑:克里斯蒂安自己找到了答案;原来这是Cocoon 3 SAX组件中的一个问题(我猜是alpha 3版本)。事实证明,如果将XML作为字符串传递到
XMLGenerator
类中,SAX解析过程中会出现一些错误,从而导致这种混乱

我想找出Cocoon stax的实际问题:

if (XMLGenerator.this.logger.isDebugEnabled()) {
    XMLGenerator.this.logger.debug("Using a string to produce SAX events.");
}
XMLUtils.toSax(new ByteArrayInputStream(this.xmlString.getBytes()), XMLGenerator.this.getSAXConsumer();
如您所见,调用
getBytes()
将使用JRE的默认编码创建一个字节数组,该编码随后将无法解析。这是因为XML声明自己是UTF-8,而数据现在又是以字节为单位的,并且可能使用Windows代码页

作为解决方法,可以使用以下方法:

new org.apache.cocoon.sax.component.XMLGenerator(xmlInput.getBytes("UTF-8"),
       "UTF-8");
这将触发正确的内部操作(Christian通过实验API发现了这一点)

我在Apache的bug追踪器中找到了


编辑2:该问题已修复,将包含在即将发布的版本中。

我正在运行Windows 7,并使用TextPad作为手动构建xml数据文件的文本编辑器。我得到的是
格式错误的ByteSequenceException
。我在xml文件中的规范是UTF-8。在四处查看之后,我发现我的编辑器有一个工具“Tools…Convert to DOS”。我这样做了,重新保存了文件,异常消失了,代码运行正常

然后,我在编辑器中查看了该文件类型的默认编码。它是ASCII,但是当我将xml编码参数更改为ASCII时,我得到了另一个不同的
格式错误的ByteSequenceException


因此,在Windows系统上,您可以尝试将xml编码保持为UTF-8,但保存文件编码的DOS。我没有进一步挖掘这项工作的原因。

同意,但这对我没有帮助。因为来自数据库的有问题字符串是从我的ORM层创建的。另外,它有0xC4,应该可以,对吧?我使用MySQL,表和列都用utf8\U general\U ci编码。我已将useUnicode=true&characterEncoding=utf8添加到我的jdbc连接中。当您碰巧使用不同的编码连接到数据库时,在jdbc连接上指定这些参数可能不是一个好主意-仅在自动检测出错时使用它。你用什么来写数据,这是BLOB还是VARCHAR列?我的工具不是那么通用,它只会用我输入的编码连接到db。此外,我实际上在没有指定它时遇到了问题。我写的数据来自一个网页,它本身有UTF-8编码:。我同时发现,我可以证明我使用了100%的utf-8。在整个试用/出错阶段,我查看了调试器中的字符串char,调试器使用196,而不是返回实际字节。现在我已经确定了正确的字节序列。谢谢你的评论,我现在已经了解了一些关于unicode/utf-8的知识。无论如何,我的问题实际上是在Cocoon 3中,在那里我需要做新的XMLGenerator(xmlInput.getBytes(“UTF-8”),“UTF-8”),而不是仅仅给出字符串。这是一种超越和超越的方式!