0

我正在将 Web 服务中收到的字符串转换为文档 (DOM) xml,如下所示:

Document file= null;
String xmlFile= "blablabla"; //latin1 encodeing

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
this.file = builder.parse(new InputSource(new StringReader(xmlFile)));

但是该字符串是用 ISO-8859-1 (latin1) 编码的,当我阅读本文档的一个节点时,我遇到了一些错误。如何使用 ISO-8859-1 编码正确创建 DOM 对象?或者如何读取字符串中编码为 Latin 1 的节点???

4

2 回答 2

1

尝试这个:

this.file = builder.parse(new ByteArrayInputStream(xmlFile.getBytes("ISO-8859-1")));
于 2012-06-20T15:13:57.500 回答
0

前言

字符串没有编码,因为它们代表一个字符序列(它们是在 unicode 标准中定义的抽象实体)。

字节序列有一个编码,可以被解释为一个字符序列(前提是你告诉java如何解释它)。

你的问题

在您的问题中,您的数据存储在一个字符串中。因此它已经被解释为一个字符序列。显然解释是不正确的。

根据您的问题和您了解数据编码的方式,有 2 个选项:

解决方案1(可能是最好的):

不要解释您收到的数据并将其保存为字节序列(Stream 或 byte[] 或 ByteArray)。然后将此字节序列直接传递给您的 DOM 解析器(只要标记正确,它将正确解码 xml 文件,无论其编码如何。

解决方案 2(可能是唯一可能的,具体取决于您获取数据的方式):

如@ThOrndike 的回答中所述,将字符串重新编码为 ByteArray:

this.file = builder.parse(new ByteArrayInputStream(xmlFile.getBytes("ISO-8859-1")));

这只有在您确定字符串一开始就被正确解释的情况下才有效。

显然,这里不是这种情况,似乎给你字符串的库已经将它解释为 UTF-8 字节序列(用'?'替换所有错误字节,这是 UTF-8 读者的行为)。在这种情况下,您无法做任何事情,因为原始字节已丢失。

您唯一的希望是解决方案 1,或者找到一种方法来强制为您提供 String 的库正确解释它。

于 2012-07-18T14:01:39.673 回答