0

我正在使用 Stax 解析器解析一个 XML 文件,该文件的编码提到了 encoding="UTF-16",但是这个 XML 文件的实际内容不是 UTF-16。我如何告诉 Stax 解析器忽略文件中提到的编码并根据内容进行自动检测

4

2 回答 2

1

根据您使用的 StAX-Parsing 方法(XMLStreamReadervs. 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 回答