使用 XMLStreamReader 转义字符

Escaped Characters with XMLStreamReader

我正在使用 XMLStreamReader 读取 xml 文件。

该文件包含以下形式的转义字符:ü

在我看来,两个转义字符应该代表字符“ü”(UTF-8 编码?)

但是 xml 流 reader 创建以下字符串: ã¼

我是不是在创建 reader 的过程中出错了?

Reader inputReader = Files.newBufferedReader(this.xmlFile.toPath(), StandardCharsets.UTF_8);
XMLInputFactory fact = XMLInputFactory.newInstance();
fact.setProperty("javax.xml.stream.isCoalescing", true);
XMLStreamReader parser = fact.createXMLStreamReader(inputReader);

Did I make something wrong during the creation of the reader?

不对,首先创建文件的人犯了这个错误。字符引用代表一个 Unicode 代码点,因此如果您想将 ü 表示为字符引用,它应该是 üü。这里似乎发生的事情是,创建该文件的人以某种方式混淆了他们的编码,并将 U+00FC 的 UTF-8 编码中的每个字节视为一个单独的字符,并将这些字符中的每一个序列化为字符引用。

如果您无法在源代码中更正文件,那么您将不得不自己修复它 post-hoc。如果此文件中的错误编码一直被应用,那么 XMLStreamReader 将为您提供一个 Java 字符串,其中包含 char 值,这些值均 <= 255。由于 Unicode 字符 0-255 与 ISO 相同-8859-1,将此字符串编码为 ISO-8859-1 将为您提供一个由相同字节值组成的 byte[],然后您可以将其 de 编码为 UTF-8获取正确的字符串:

String correctString = new String(mangledString.getBytes("ISO-8859-1"), "UTF-8");