DOM4J utf-8编码Umlaute(Ä,ü,ß)错误

Jak*_*chs 3 java xml utf-8 character-encoding dom4j

DOM4j用于解析和编写始终在UTF-8中的XML-Tree 。

我的XML文件包含德语特殊字符。解析它们不是问题,但是当我将树写入文件时,特殊字符将被转换为?字符。

我无法更改XML文件的编码,因为它仅限于UTF-8

SAXReader xmlReader = new SAXReader();
xmlReader.setEncoding("UTF-8");

Document doc = xmlReader.read(file);
doc.setXMLEncoding("UTF-8");
Element root = doc.getRootElement();

// manipulate doc

OutputFormat format = new OutputFormat();

format.setEncoding("UTF-8");

XMLWriter writer = new XMLWriter(new FileWriter(file), format);

writer.write(doc);
writer.close();
Run Code Online (Sandbox Code Playgroud)

预期产量

... 
<statementText>This is a test!Ä Ü ß</statementText>
...
Run Code Online (Sandbox Code Playgroud)

实际产量

...
<statementText>This is a test!? ? ?</statementText>
...
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 5

您正在将传递FileWriterXMLWriter。一个Writer已经处理Stringchar[]数据,因此它已经处理了编码,这意味着XMLWriter不会影响它。

另外,这FileWriter是一个特别有问题的Writer类型,因为您永远无法指定应使用哪种编码,而是始终使用平台默认编码(在Windows上通常类似于ISO-8859-1,在Linux上类似于UTF-8)。出于这个原因,基本上不应该使用它。

要让XMLWriter应用程序根据配置提供给它,请将其传递给OutputStream来代替(它处理byte[])。在此使用的最明显的方法是FileOutputStream

XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
Run Code Online (Sandbox Code Playgroud)

JavaDocXMLWriter甚至针对以下内容进行了记录

警告:使用您自己的Writer可能会导致忽略编写者的首选字符编码。如果您使用的编码不是UTF8,建议使用采用OutputStream的方法。

可以说警告有点误导,因为Writer即使您打算写入UTF-8数据,警告也会有问题。