用XML编写俄语

时间:2010-04-03 10:48:55

标签: java xml

我正在用Java编写一个Xml Tag Renamer类,它读取XML,重命名标记并使用DocumentBuilderFactoryTransformerFactory将它们写回另一个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();

2 个答案:

答案 0 :(得分:3)

我建议直接将变压器的结果输出到文件:

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

答案 1 :(得分:1)

你的问题(几乎可以肯定)是你混淆了什么是字符和什么是字节。这是你可以用英语(大部分也用德语)来逃避的东西,但是在像西里尔语或日语和中文的脚本中,你必须把它弄好。首先要检查的是\u0000变量中是否有\u00ff - xmlString范围之外的任何字符。如果是这样,您必须使用OutputStreamWriter实例来执行从字符到字节的映射。如果没有,转换已经应用,你需要将该字符串中捕获的字节写入文件,而不是进一步修改它们(同样,OutputStreamWriter是最简单的方法,但使用{ {1}}在最后阶段进行编码,因为它不重新映射字节)。

直接从变换器输出变换后的XML比首先捕获它更容易。毕竟,大多数XML在技术意义上只是人类可读的......