如何在ISO-8859-1中将字符串转换为带有字符集的文档(DOM)

时间:2012-06-20 15:06:50

标签: java string dom character-encoding iso-8859-1

我正在将Web服务中收到的字符串转换为Document(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的节点?

2 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

<强>前言

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

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

您的问题

在您的问题中,您的数据存储在String中。因此它已被解释为一系列字符。显然这种解释是错误的。

根据您的问题以及您了解数据编码的方式,有两个选项:

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

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

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

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

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

这只有在您确定首先正确解释了String时才有效。

显然,这不是这种情况,似乎提供String的库已经将其解释为UTF-8字节序列(用'?'替换所有错误字节,这是UTF的行为-8读者)。在这种情况下,由于原始字节丢失,您无法执行任何操作。

您唯一的希望是解决方案1,或者找到一种强制库的方法,使您能够正确地解释它。