将Windows-1252 xml文件转换为UTF-8

时间:2013-10-03 16:47:31

标签: java xml utf-8 xml-parsing xmlencoder

是否有任何方法可以转换来自Windows-1252'的大型XML文件(500 + MB)。编码为' UTF-8'在java编码?

3 个答案:

答案 0 :(得分:3)

不确定

  • 使用Windows-1252打开包含在FileInputStream中的InputStreamReader作为输入
  • 使用UTF-8编码打开包含在FileOutputStream中的OutputStreamWriter
  • 创建缓冲区char数组(例如16K)
  • 反复读入数组然后写了很多内容:

    char[] buffer = new char[16 * 1024];
    int charsRead;
    while ((charsRead = input.read(buffer)) > 0) {
        output.write(buffer, 0, charsRead);
    }
    
  • 不要忘记之后关闭输出! (否则可能存在永远不会写入磁盘的缓冲数据。)

请注意,由于它是XML,您可能还需要手动更改XML声明,因为它指定它在Windows-1252中...

这种方式在流媒体基础上工作意味着您无需担心文件的大小 - 它一次只能读取内存中最多16K个字符。

答案 1 :(得分:2)

这是一次性还是需要重复运行并提高效率的工作?

如果是一次性的话,我认为不需要Java编码。只需运行查询“。”,例如

java net.sf.saxon.Query -s:input.xml -qs:. -o:output.xml

确保你分配说3Gb的内存。

如果您反复进行并希望采用流式处理方法,则必须选择将其作为文本处理(如Jon Skeet建议)或XML。以XML作为XML的优势主要在于XML声明将被处理,字符引用将转换为字符。最简单的方法是使用JAXP身份转换:

Source in = new StreamSource(new File("input.xml"));
TransformerFactory f = TransformerFactory.newInstance();
Result out = new StreamResult(new File("output.xml"));
f.newTransformer().transform(in, out);

答案 2 :(得分:0)

如果这是一次性的,Java可能不是最合适的工具。考虑iconv

iconv -f windows-1252 -t utf-8 <source.xml >target.xml

这具有流媒体的所有好处,无需您编写任何代码。

与迈克尔的解决方案不同,这不会处理XML声明。如有必要,请手动编辑,或者现在使用UTF-8,省略它。