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

Java 将Windows-1252 xml文件转换为UTF-8,java,xml,utf-8,xml-parsing,xmlencoder,Java,Xml,Utf 8,Xml Parsing,Xmlencoder,是否有任何方法可以将大型XML文件(500+MBs)从java中的“Windows-1252”编码转换为“UTF-8”编码 当然可以: 使用Windows-1252打开包装在InputStreamReader中的FileInputStream,以进行输入 打开一个用UTF-8编码的OutputStreamWriter包装的FileOutputStream 创建缓冲区字符数组(例如16K) 重复读取数组并写入已写入的内容: char[] buffer = new char[16 * 1024];

是否有任何方法可以将大型XML文件(500+MBs)从java中的“Windows-1252”编码转换为“UTF-8”编码

当然可以:

  • 使用Windows-1252打开包装在
    InputStreamReader
    中的
    FileInputStream
    ,以进行输入
  • 打开一个用UTF-8编码的
    OutputStreamWriter
    包装的
    FileOutputStream
  • 创建缓冲区字符数组(例如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个字符。

这是一次性的还是需要重复运行以提高效率的作业

如果是一次性的,我认为没有必要使用Java编码。例如,只需运行查询“”

java net.sf.saxon.Query -s:input.xml -qs:. -o:output.xml
确保您分配了3Gb的内存

如果您重复地执行此操作,并且希望采用流式方法,那么您必须选择将其作为文本处理(正如Jon Skeet所建议的)还是作为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);

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

iconv-f windows-1252-t utf-8 target.xml
这具有流式传输的所有好处,无需编写任何代码

与Michael的解决方案不同,这不会处理XML声明。如有必要,请手动编辑此项,或者,现在您正在使用UTF-8,请忽略它

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