我正在使用 Stax 解析器解析一个 XML 文件,该文件的编码提到了 encoding="UTF-16",但是这个 XML 文件的实际内容不是 UTF-16。我如何告诉 Stax 解析器忽略文件中提到的编码并根据内容进行自动检测
问问题
668 次
2 回答
1
根据您使用的 StAX-Parsing 方法(XMLStreamReader
vs. XMLEventReader
),您可以将编码传递给XMLInputFactory
.
- createXMLStreamReader(InputStream 流,字符串编码)
- createXMLEventReader(InputStream 流,字符串编码)
如果没有指定,一些 StAX 实现会尝试“猜测”实际编码(例如,Weblogic 的 StAX-Implementation 尝试这样做),而其他实现会使用 JVM 的默认编码(系统属性file.encoding
;小心:必须设置在启动时已经,在运行时没有变化)。
如果您想/必须自己弄清楚编码,则必须自己实现。我必须这样做一次 - 根据我当时的要求、规范和环境 - 最终采用了一种不太好的试错方法,我不得不尝试我系统中支持的所有编码. 一个接一个,直到我有一个“足够好的匹配”。我还必须非常小心BOM(字节顺序标记)。
一般来说,我认为 XML-Prologue 应该保持正确的编码,因为在代码中所做的一切只能是最佳猜测(然而,这个猜测也可能是正确的)。
作为个人笔记,这可能是非常错误的,但对我来说效果很好:由于 XML 主要是输入数据,我坚信GIGO。
于 2013-06-04T06:49:44.330 回答
0
你可以尝试这样的事情:
byte[] byteArray = null;
try {
if (something)) {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_UTF_16);
} else {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_ISO_8859_1);
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try {
xmlEventReaderSource = inputFactory.createXMLEventReader(inputStream);
} catch (XMLStreamException e) {
logger.error("ERROR is StAX reader initialization" + e.getLocalizedMessage());
}
于 2016-06-28T03:03:56.573 回答