我正在尝试在 Windows 7 上捕获一个 jar 的控制台输出(用 System.out
编写)并将其写为 XML 文件。这可行,但我遇到编码问题(例如,使用“ë”)。
我有这段代码用于读取控制台输出:
final LinkedList<String> texOutput = new LinkedList<String>();
final Process p = Runtime.getRuntime().exec("java -jar " + absoluteNameOfJar, null, tmpDir);
String line;
final BufferedReader output = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp1252"));
while ( (line = output.readLine()) != null) {
texOutput.add(line);
}
下面是将 LinkedList
写入 XML 的代码(使用 jdom
)
if (texOutput.size() > 0) {
final Element xmlTeXOutput = new Element(XML_ELEMENT_KEY_TEX_OUTPUT);
for (String line : texOutput) {
xmlLine = new Element(XML_ELEMENT_KEY_LINE);
xmlLine.setText(line);
xmlTeXOutput.addContent(xmlLine);
}
genOut.addContent(xmlTeXOutput);
}
这样,我在 XML 中遇到编码错误(来自错误转换的“ë”):“3 字节 UTF-8 序列的第 2 字节无效”。
我发现了这些问题:How to get console charset? , Java : How to determine the correct charset encoding of a stream - 没有给我任何希望 - 似乎我必须为 InputStreamReader
设置正确的编码,但似乎没有可移植的方法来查找实际使用的编码。有没有办法来解决这个问题?
哦,如果可能的话,可移植解决方案也应该适用于 MacOS。而且我不想将 XML 的编码设置为 ISO-8859-1(根据 Google 的说法,这似乎是常见的解决方法):UTF-8 应该可以。
编辑:我这样编写XML文件:
final XMLOutputter xmlOutputter = new XMLOutputter(Format.getPrettyFormat());
final String targetXMLFileName = FilenameUtils.concat(targetDirName, xmlID.getText() + "-out.xml");
final File targetXMLFile = new File(targetXMLFileName);
final FileWriter targetXMLFileWriter = new FileWriter(targetXMLFile);
xmlOutputter.output(xmlOutput, targetXMLFileWriter);
targetXMLFileWriter.close();
最佳答案
这里存在许多潜在的问题:
- “Cp1252”不是 default system encoding其他应用程序正在使用 stdout
- 默认编码不是 Unicode(可以 cause data loss )
- 将 DOM 序列化为 XML 文件时出现转码错误
验证是否从其他进程正确读取数据。如果默认编码导致问题,您可能需要使用 main
方法编写一个包装应用程序, sets stdout到 Unicode 编码流,然后调用另一个 main
。然后使用相同的编码在上述代码中进行解码。
还有一个 hack涉及 file.encoding
但这可能会导致 unintended side-effects .
如果问题出在序列化 XML 上,则即使声明是 UTF-8,也可能使用错误的编码写入数据。当序列化到 Writer
时,通常会发生这种情况,因为序列化程序不会像使用 OutputStream
那样控制输出编码。
编辑
问题出在这里:
new FileWriter(targetXMLFile);
Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable.
如果您始终需要 UTF-8,construct a stream写入 UTF-8。
关于Java:如何正确地将 Windows 控制台输出转换为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271270/