XML 输出中的编码问题

Encoding problems in the XML output

我写了一个 XML 解析器,除了文本编码之外一切正常。 我做了一些研究来解决这个问题,但我仍然被困住了。

我有一个包含电影标题的字符串列表,我用 CDATA 封装将它添加到 XML,例如:

CDATA movieTitle= new CDATA(aMovie.getTitle());
movie.addContent(new Element("title").addContent(movieTitle));

我用这个保存它:

XMLOutputter xmlOutput = new XMLOutputter();
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8");
xmlOutput.setFormat(format);
xmlOutput.output(doc, new FileWriter(fileName+ ".xml"));

但结果是:

<title><![CDATA[LA LOI DU MARCHxC9]></title>

应该是"LA LOI DU MARCHÉ".

我应该怎么做才能避免这种情况发生?

这是 JDOM 的一个常见问题,这是一个源自 Java 如何处理 OutputStreams 和 Writers 的问题。本质上,Java 不会使文件编码在 Writer 中可见...。在您的情况下,您可能 运行 是基于 ASCII 的编写器...并且它无法编码unicode É 正确。

参见 the XMLOutputter's documentation

上的注释

解决方案是使用 FileoutputStream 而不是 FileWriter。由于 UTF-8 是默认编码,因此您无需设置它。试一试:

XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat());
try (OutputStream out = new FileOutputStream(fileName+ ".xml")) {
    xmlOutput.output(doc, out);
}

由于 XML 已经知道编码,并将其放在 <?xml encoding ?> 中,我更喜欢 @rolfl 的解决方案,一个二进制 OutputStream。

这里的错误是,FileWriter 是一个使用默认编码的非常古老的实用程序 class。这绝对是不可携带的。

xmlOutput.output(doc, Files.newBufferedWriter(Paths.get(fileName+ ".xml"),
        StandardCharsets.UTF_8));