2字节UTF-8序列的第2个字节无效。

32

我试图解析一个带有<?version = 1.0, encoding = UTF-8>的XML文件,但遇到了错误信息invalid byte 2 of 2-byte UTF-8 sequence。有人知道是什么原因导致了这个问题吗?


你是如何解析XML文件的? - jtahlborn
7个回答

25

最常见的情况是由于输入了 ISO-8859-x(如 Latin-1)而解析器认为它正在获取 UTF-8。某些 Latin-1 字符序列(两个带有重音或变音符号的连续字符)形成的内容在 UTF-8 中是无效的,并且特别是根据第一个字节,第二个字节具有意外的高位比特。

这很容易发生,当某个过程使用 Latin-1 输出 XML 时,但要么忘记输出 XML 声明(在这种情况下,XML 解析器必须默认使用 UTF-8,根据 XML 规范),要么声称它是 UTF-8,即使它不是。


1
有什么建议可以解决这个问题吗?我在使用第三方库XMLTask定义ant任务时遇到了这个问题。 - AgentKnopf
那就有点棘手了;否则通常的做法是显式地为特定编码创建InputStreamReader,然后将其提供给XML解析器。但不确定在Ant中该怎么做...当然,如果可能的话,可以修复XML文件本身。 - StaxMan
我找到了问题所在 - 在我的一个xml文件中,我有一个Umlaut(ä,ö,ü),当我将xml文件转换为不同的格式时,它被搞砸了。一旦我删除了那个Umlaut,它就可以正常工作了。 - AgentKnopf
没错 - 这些字符是使用 Latin-1 (ISO-8859-1) 单字节表示的,而在 UTF-8 中则需要 2 个字节。因此,内容实际上是以 Latin-1 的形式存在的,但某个地方却声称它应该是 UTF-8。 - StaxMan

6

可能是解析器设置为UTF-8,但文件实际上使用其他编码方式,或者文件声明为使用UTF-8,但实际上并不是。


6
你可以尝试更改String.getBytes()使用的默认字符编码为utf-8。使用VM选项-Dfile.encoding=utf-8。

6

我也遇到了同样的问题。我的问题是我用jdom创建了一个新的XML文件,并使用FileWriter(xmlFile),但是FileWriter无法创建UTF-8文件。 改用FileOutputStream(xmlFile)解决了问题。


3
我也遇到了同样的问题,当我试图将我的.xml文件导入我的java工具时。我找到了一个好的解决方案: 1. 使用Notepad ++打开.xml文件,然后将.xml文件保存为.rtf文件。然后在WordPad应用程序中打开此文件。 2. 将.rtf文件另存为.txt文件,然后使用Notepad打开它,并再次将其保存为.xml文件。在Notepad中保存时,请确保在弹出窗口的末尾附近选择“编码:UTF-8”选项。 这对我有用,希望对你也有用。

2

对于那些仍然遇到此类错误的人。

由于正在使用UTF-8,请检查您的XML文档中是否有任何拉丁字母等:

我曾经遇到过相同的问题,原因是我有这个:

<n:name>Åke Jógvan Øyvind</n:name>

希望这可以帮到您。

1

在这种情况下,更改输入的编码方式可能会有所帮助:

XMLEventReader eventReader =
                            inputFactory.createXMLEventReader(in, 
                                    "utf-8"
                                    //"windows-1251"
                            );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接