java + xml:库处理来自 的编码标题?

发布于 2025-01-07 20:41:19 字数 502 浏览 0 评论 0原文

我已经习惯使用 直到现在才发生,其他编码可能存在一些微妙之处使用标准 Java XML 库(SAX、DOM、STaX)...

在读取 XML 文档时,这些库是否自动处理标头中的 encoding 属性?如果是这样,这在哪里记录? (它不在 DocumentBuilder 中或 DocumentBuilderFactory)如果不是,我该怎么做才能使其适用于不同的编码?

I'm so used to using <?xml version="1.0" encoding="UTF-8"?> that it didn't occur until now that there might be some subtleties with other encodings using the standard Java XML libraries (SAX, DOM, STaX)...

Do these libraries automatically handle the encoding attribute in the header when reading XML documents? If so, where is this documented? (It's not in DocumentBuilder or DocumentBuilderFactory) If not, what do I have to do to make it work out OK for different encodings?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妄想挽回 2025-01-14 20:41:19

DocumentBuilder 使用 SAX API 将文档提供给实现进行解析(尽管该实现实际上可能不使用 SAX 解析器),以及 SAX 的 org.xml.sax.InputSource< 的 Javadoc /code> 说明了它对标头的作用。

SAX 解析器将使用 InputSource 对象来确定如何
读取 XML 输入。如果有可用的字符流,解析器
将直接读取该流,忽略任何文本编码
在该流中找到的声明。如果没有字符流,但是
有一个字节流,解析器将使用该字节流,使用
输入源中指定的编码或其他(如果没有编码)
指定)使用算法自动检测字符编码
例如 XML 规范中的一个。如果两个字符都不是
流或字节流都不可用,解析器将尝试打开
到由系统标识符标识的资源的 URI 连接。

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

DocumentBuilder uses the SAX API to provide the document to the implementation for parsing (though the implementation might not actually use a SAX parser), and the Javadoc for SAX's org.xml.sax.InputSource says what it does with the header.

The SAX parser will use the InputSource object to determine how to
read XML input. If there is a character stream available, the parser
will read that stream directly, disregarding any text encoding
declaration found in that stream. If there is no character stream, but
there is a byte stream, the parser will use that byte stream, using
the encoding specified in the InputSource or else (if no encoding is
specified) autodetecting the character encoding using an algorithm
such as the one in the XML specification. If neither a character
stream nor a byte stream is available, the parser will attempt to open
a URI connection to the resource identified by the system identifier.

So interesting cases could include an XML stream supplied via HTTP, with an HTTP Content-Type header that conflicts with the XML's encoding declaration.

挽容 2025-01-14 20:41:19

对于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 和编码的更多信息

For JAXB (JSR-222) you can use the Marshaller.JAXB_ENCODING flag to specify an 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);

If you are marshalling to a java.io.Writer you will need to ensure that you have constructed the writer to be of the appropriate encoding:

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);

For More Information on JAXB and Encoding

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文