我写了一个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É”。
我应该怎么做以避免这种情况发生?
答案 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);
}