2010-04-03 76 views
3

我正在編寫一個帶有Java的Xml Tag Renamer類,它讀取XML,重命名標記並使用DocumentBuilderFactoryTransformerFactory(保留文本節點)將它們寫回到另一個XML文件中。它以前用德文和英文文本工作得很好,直到今天,當我試圖用俄文文本重命名XML文件時。我在新創建的XML文件中獲得了?????,而不是源文本。我試過設置編碼用XML寫俄語

任何想法如何糾正?

PS。在進入TransformerFactory前,字符串是正確的,因爲我在調試器中檢查過。我試過將OutputKeys.ENCODING設置爲UTF-8ISO-8859-5。他們都沒有幫助。

變壓器的地方:

// Output the XML 

// Set up a transformer 
TransformerFactory transFactory = TransformerFactory.newInstance(); 
Transformer transformer = transFactory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
// Fix to a bug about indent in transformer 
transformer.setOutputProperty 
("{http://xml.apache.org/xslt}indent-amount", "4"); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

// TODO encoding parameter 
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

// Create string from xml tree 
StringWriter sw = new StringWriter(); 
StreamResult result = new StreamResult(sw); 
DOMSource source = new DOMSource(doc); 
transformer.transform(source, result); 

String xmlString = sw.toString(); 

xmlString.replaceAll("\n", System.getProperty("line.separator")); 


// Write to file 
BufferedWriter output = new BufferedWriter(new FileWriter(outputPath)); 
output.write(xmlString); 
output.close(); 

回答

3

我建議直接輸出從變壓器結果到文件:

transformer.transform(source, new StreamResult(
    new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"))); 
+1

謝謝!它適用於您的代碼! 我調整了我的一點,它似乎關鍵在'OutputStreamWriter'上。問題可能在於'FileWriter''「這個類的構造函數假定默認的字符編碼和默認的字節緩衝區大小是可以接受的。」(JavaDoc)和'OutputStreamWriter'支持自定義編碼。 再次感謝它! – 2010-04-03 11:09:57

1

你的問題是(幾乎可以肯定),你混了什麼是一個字符,什麼是一個字節。這是你可以用英語(而且大部分是用德語)逃避的東西,但是在像西里爾語或日本語和中國語的腳本中,你必須把它弄清楚。首先要檢查的是,您在xmlString變量中是否有\u0000\u00ff之間的任何字符。如果是這樣,您必須使用OutputStreamWriter實例來執行從字符到字節的映射。如果沒有,轉換已經被應用,你需要寫入字符串中的字節到文件中,而不會進一步改變它們(再次,OutputStreamWriter是最簡單的方法,但在最終使用ISO8859-1編碼階段,因爲它不會重新映射字節)。

從變換器直接輸出變換的XML比首先捕獲變換容易。畢竟,大多數XML在技術上只是人類可讀的......