我有以下的方法写一个XMLDOM到流:transformer.setOutputProperty(OutputKeys.ENCODING,“UTF-8”)不工作
public void writeToOutputStream(Document fDoc, OutputStream out) throws Exception {
fDoc.setXmlStandalone(true);
DOMSource docSource = new DOMSource(fDoc);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.transform(docSource, new StreamResult(out));
}
我正在测试一些其他的XML功能,这只是我用来写入文件的方法。我的测试程序生成了33个测试用例,其中写出了文件。其中28有以下标题:
<?xml version="1.0" encoding="UTF-8"?>...
但由于某些原因,测试案例1,现在生产:
<?xml version="1.0" encoding="ISO-8859-1"?>...
点和四个其他农产品:
<?xml version="1.0" encoding="Windows-1252"?>...
,你可以清楚地看到,我正在将ENCODING输出密钥设置为UTF-8。这些测试曾用于早期版本的Java。我有一段时间没有运行测试(超过一年),但今天在“Java(TM)SE运行时环境(build 1.6.0_22-b04)”上运行。“我得到了这个有趣的行为。
我已验证导致问题的文档是从最初具有这些编码的文件中读取的。看来这些库的新版本正试图保留读取的源文件的编码。但这不是我想要的...我真的希望输出为UTF-8。
有谁知道任何可能导致转换器忽略UTF-8编码设置的其他因素吗?是否还有其他必须在文档上设置,以便忘记最初读取的文件的编码?
UPDATE:
我检查了同一个项目从另一台机器上,建造和运行测试那里。在那台机器上所有的测试都通过了!所有的文件头都有“UTF-8”。该机器具有“Java(TM)SE运行时环境(内部版本1.6.0_29-b11)”两台机器都运行Windows 7.在正常工作的新机器上,使用jdk1.5.0_11来构建版本,但是旧版本机器jdk1.6.0_26用于构建。用于两个版本的库完全一样。它是否可以在构建时与JDK 1.6不兼容?
UPDATE:
后4.5年,Java库仍然是断开的,但由于以下Vyrx的建议,我终于有了一个妥善的解决办法!
public void writeToOutputStream(Document fDoc, OutputStream out) throws Exception {
fDoc.setXmlStandalone(true);
DOMSource docSource = new DOMSource(fDoc);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".getBytes("UTF-8"));
transformer.transform(docSource, new StreamResult(out));
}
解决方案是禁止写入标题,并在将XML序列化为输出蒸汽之前写入正确的标题。跛脚,但它会产生正确的结果。 4年前破解的测试现在正在运行!
这的确看起来像一些错误或不兼容的问题。没有可重复的测试用例,任何人都不可能提供帮助。你能否提供一个[SSCCE](http://sscce.org/),并列出工具/库的所有版本? – sleske 2013-05-19 08:17:21
有几个地方可以检查您的语言环境。您的本地计算机具有区域设置,您的IDE可能具有区域设置,并且您的JVM进程具有区域设置。在我的Locale更改之前,我已经看到类似这样的问题。你如何运行测试? java.exe,maven,IDE? – 2013-06-10 11:50:50
由于我已经直接指定了UTF-8,所以语言环境应该没有问题,但要直接回答您的问题,测试代码将作为调用Java.exe的命令行调用位于美国太平洋海岸的Windows系统上并针对美国英语和太平洋时区进行配置。 – AgilePro 2013-06-14 01:30:01