gpt4 book ai didi

java - 使用 Java 和 UTF-8 编码生成有效的 XML

转载 作者:IT老高 更新时间:2023-10-28 20:45:45 35 4
gpt4 key购买 nike

我正在使用 JAXP 生成和解析一个 XML 文档,其中一些字段是从数据库加载的。

序列化 XML 的代码:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("test");
root.setAttribute("version", text);
doc.appendChild(root);

DOMSource domSource = new DOMSource(doc);
TransformerFactory tFactory = TransformerFactory.newInstance();

FileWriter out = new FileWriter("test.xml");
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(domSource, new StreamResult(out));

解析 XML 的代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("test.xml");

我遇到以下异常:

[Fatal Error] test.xml:1:4: Invalid byte 1 of 1-byte UTF-8 sequence.
Exception in thread "main" org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at com.test.Test.xml(Test.java:27)
at com.test.Test.main(Test.java:55)

字符串文本包括 u-umlaut 和 o-umlaut(字符代码 0xFC 和 0xF6)。这些是导致错误的字符。当我自己转义字符串以使用 ü和 ö然后问题就消失了。当我写出 XML 时,其他实体会自动编码。

如何在不自己替换这些字符的情况下正确写入/读取我的输出?

(我已经阅读了以下问题:

How to encode characters from Oracle to XML?

Repairing wrong encoding in XML files )

最佳答案

使用 FileOutputStream 而不是 FileWriter。

后者应用自己的编码,几乎可以肯定不是 UTF-8(取决于您的平台,可能是 Windows-1252 或 IS-8859-1)。

编辑(现在我有时间):

允许将没有序言的 XML 文档编码为 UTF-8 或 UTF-16。序言允许指定其编码(序言只能包含 US-ASCII 字符,因此序言始终可读)。

Reader 处理字符;它将解码底层 InputStream 的字节流。结果,当您将 Reader 传递给解析器时,您是在告诉它您已经处理了编码,因此解析器将忽略序言。当您传递一个 InputStream(读取字节)时,它不会做出这种假设,而是会查看序言来定义编码——如果不存在,则默认为 UTF-8/UTF-16。

我从未尝试过读取以 UTF-16 编码的文件。我怀疑解析器会查找字节顺序标记 (BOM) 作为文件的前 2 个字节。

关于java - 使用 Java 和 UTF-8 编码生成有效的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443305/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com