Java:如何正确地将 Windows 控制台输出转换为 XML?

标签 java xml unicode console jdom

我正在尝试在 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();

最佳答案

这里存在许多潜在的问题:

验证是否从其他进程正确读取数据。如果默认编码导致问题,您可能需要使用 main 方法编写一个包装应用程序, sets stdout到 Unicode 编码流,然后调用另一个 main。然后使用相同的编码在上述代码中进行解码。

还有一个 hack涉及 file.encoding 但这可能会导致 unintended side-effects .

如果问题出在序列化 XML 上,则即使声明是 UTF-8,也可能使用错误的编码写入数据。当序列化到 Writer 时,通常会发生这种情况,因为序列化程序不会像使用 OutputStream 那样控制输出编码。

<小时/>

编辑

问题出在这里:

new FileWriter(targetXMLFile);

来自the documentation :

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/

相关文章:

c# - 使用 XmlWriter 以迭代方式构建 XML 文件

Python 子进程 stdin=subprocess.PIPE 和 unicode

java - 如何在java中正确复制对象?

java - 在多线程环境中清除嵌套循环中的 Map

java - Hibernate 5仍然忽略@Table注释来查找表

ios - 使用钛合金,我正在尝试制作一个基本的 : name password and email field. 我该怎么做?

xml - 使用相对路径使用 DTD 或 XSD 进行本地 XML 验证?

java - 将 Stax XML 写入 ObjectOutputStream(socket.getOutputStream) 时出现 MalformedByteSequenceException

MySQL不想存储unicode字符

java并发Future任务在发生任何异常时返回null并且不传播它