编码XML输出中的问题

时间:2015-06-09 09:09:34

标签: java xml jdom

我写了一个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 LOIDUMARCHÉ”。

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

2 个答案:

答案 0 :(得分:2)

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

这里的错误是,FileWriter是一个使用默认编码的非常旧的实用程序类。这绝对是不便携的。

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

答案 1 :(得分:1)

这是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);
}