我已经习惯使用<?xml version="1.0" encoding="UTF-8"?>
,直到现在才发生使用标准Java XML库(SAX,DOM,STaX)的其他编码可能存在一些细微之处......
读取XML文档时,这些库是否会自动处理标题中的encoding
属性?如果是这样,这在哪里记录? (它不在DocumentBuilder或DocumentBuilderFactory中)如果没有,我需要做些什么才能使其在不同的编码中正常运行?
答案 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和编码的更多信息