DOM4J utf-8 编码 Umlaute(Ä,ü,ß) 错误
DOM4J utf-8 encoding Umlaute(Ä,ü,ß) incorrectly
我正在使用 DOM4j
来解析和编写一个 XML-Tree,它总是在 UTF-8.
我的 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();
预期输出
...
<statementText>This is a test!Ä Ü ß</statementText>
...
实际产量
...
<statementText>This is a test!� � �</statementText>
...
您正在将 FileWriter
传递给 XMLWriter
。 Writer
已经处理了 String
或 char[]
数据,所以它已经处理了编码,这意味着 XMLWriter
没有机会影响它。
此外 FileWriter
是一个特别有问题的 Writer
类型,因为您永远无法指定它应该使用哪种编码,而是它总是使用平台默认编码(通常类似于 ISO-8859 -1 Windows 和 UTF-8 Linux)。出于这个原因,它基本上不应该被使用。
为了让 XMLWriter
应用它作为配置给出的内容,而是传递给它一个 OutputStream
(它处理 byte[]
)。在这里使用的最明显的一个是 FileOutputStream
:
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
这甚至记录在 JavaDoc for XMLWriter
:
Warning: using your own Writer may cause the writer's preferred character encoding to be ignored. If you use encodings other than UTF8, we recommend using the method that takes an OutputStream instead.
可以说警告有点误导,因为即使您打算写入 UTF-8 数据,Writer
也可能有问题。
我正在使用 DOM4j
来解析和编写一个 XML-Tree,它总是在 UTF-8.
我的 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();
预期输出
...
<statementText>This is a test!Ä Ü ß</statementText>
...
实际产量
...
<statementText>This is a test!� � �</statementText>
...
您正在将 FileWriter
传递给 XMLWriter
。 Writer
已经处理了 String
或 char[]
数据,所以它已经处理了编码,这意味着 XMLWriter
没有机会影响它。
此外 FileWriter
是一个特别有问题的 Writer
类型,因为您永远无法指定它应该使用哪种编码,而是它总是使用平台默认编码(通常类似于 ISO-8859 -1 Windows 和 UTF-8 Linux)。出于这个原因,它基本上不应该被使用。
为了让 XMLWriter
应用它作为配置给出的内容,而是传递给它一个 OutputStream
(它处理 byte[]
)。在这里使用的最明显的一个是 FileOutputStream
:
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
这甚至记录在 JavaDoc for XMLWriter
:
Warning: using your own Writer may cause the writer's preferred character encoding to be ignored. If you use encodings other than UTF8, we recommend using the method that takes an OutputStream instead.
可以说警告有点误导,因为即使您打算写入 UTF-8 数据,Writer
也可能有问题。