Stax解析器忽略编码

时间:2013-05-23 15:20:47

标签: stax

我使用Stax解析器解析XML文件,其编码提到encoding =“UTF-16”, 但是这个XML文件的实际内容不是UTF-16。我怎样才能告诉Stax解析器忽略文件中提到的编码并根据内容进行自动检测

2 个答案:

答案 0 :(得分:1)

根据您使用的StAX-Parsing的哪种方法(XMLStreamReaderXMLEventReader),您可以将编码传递给XMLInputFactory的create-Method。

  • createXMLStreamReader(InputStream stream,String encoding)
  • createXMLEventReader(InputStream stream,String encoding)

如果没有指定,一些StAX实现试图“猜测”实际编码(例如,Weblogic的StAX-Implementation试图这样做),而其他人则会使用JVM的Default-Encoding(System-Property {{1}小心:必须在启动时设置,在运行时没有变化。

如果您想要/必须自己弄清楚编码,您必须自己实现。我必须这样做一次 - 基于我当时的要求,规格和环境 - 最后得到了一点但并不是非常好的试错法,我不得不尝试我系统支持的所有编码。一个接一个,直到我有一个“足够好的比赛”。我还必须非常小心BOMs(字节顺序标记)。

一般来说,我认为XML-Prologue应该保持正确的编码,因为在代码中所做的任何事情都只能是最好的猜测(但是,这个猜测也可以是正确的)。

作为个人说明,这可能是非常错误的,但对我来说效果很好:由于XML主要是输入数据,我坚信GIGO

答案 1 :(得分: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());

        }