繁体   English   中英

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

[英]Convert Windows-1252 xml file to UTF-8

有什么方法可以将大型XML文件(500 + MBs)从Java中的“ Windows-1252”编码转换为“ UTF-8”编码?

当然:

  • 使用Windows-1252打开包装在InputStreamReaderFileInputStream作为输入
  • 打开包装在OutputStreamWriter具有UTF-8编码的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

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

这具有流式传输的所有优点,而无需您编写任何代码。

与Michael的解决方案不同,这不会处理XML声明。 如有必要,请手动进行编辑,或者现在使用UTF-8,则将其省略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM