java + xml:libraries处理<! - ?xml? - >头文件的编码?

时间:2012-02-21 15:07:42

标签: java xml encoding

我已经习惯使用<?xml version="1.0" encoding="UTF-8"?>,直到现在才发生使用标准Java XML库(SAX,DOM,STaX)的其他编码可能存在一些细微之处......

读取XML文档时,这些库是否会自动处理标题中的encoding属性?如果是这样,这在哪里记录? (它不在DocumentBuilderDocumentBuilderFactory中)如果没有,我需要做些什么才能使其在不同的编码中正常运行?

2 个答案:

答案 0 :(得分:1)

DocumentBuilder使用SAX API将文档提供给实现进行解析(尽管实现可能实际上并不使用SAX解析器),而SAX的org.xml.sax.InputSource的Javadoc说明了它对报头中。

  

SAX解析器将使用InputSource对象来确定如何操作   读取XML输入。如果有可用的字符流,则解析器   将直接读取该流,无视任何文本编码   在该流中发现的声明。如果没有字符流,但是   有一个字节流,解析器将使用该字节流   InputSource中指定的编码,否则(如果没有编码)   指定)使用算法自动检测字符编码   例如XML规范中的那个。如果既不是人物   流也没有字节流可用,解析器将尝试打开   与系统标识符标识的资源的URI连接。

如此有趣的案例可能包括通过HTTP提供的XML流,其HTTP Content-Type标头与XML的编码声明冲突。

答案 1 :(得分:0)

对于JAXB (JSR-222),您可以使用Marshaller.JAXB_ENCODING标志来指定编码:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
marshaller.marshal(address, System.out);

如果您要编组为java.io.Writer,则需要确保您已将编写器构造为具有适当的编码:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
OutputStreamWriter writer = new OutputStreamWriter(System.out, "ISO-8859-1");
marshaller.marshal(address, writer);

有关JAXB和编码的更多信息