我有以下的方法寫一個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