我正在将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的节点?
答案 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,或者找到一种强制库的方法,使您能够正确地解释它。