使用Groovy将ISO-8859-1转换为UTF-8

12

我需要将一个ISO-8859-1编码的文件转换为UTF-8编码,同时不丢失内容信息......

我有一个长这样的文件:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld>

我不想将它编码为UTF-8。 我尝试了以下方法:

f=new File('c:/temp/myiso88591.xml').getText('ISO-8859-1')
ts=new String(f.getBytes("UTF-8"), "UTF-8")
g=new File('c:/temp/myutf8.xml').write(ts)

由于字符串不兼容,导致代码无法正常工作。 然后我读到了一些关于ByteStreamReader/Writer/StreamingMarkupBuilder等的内容...

然后我尝试了...

f=new File('c:/temp/myiso88591.xml').getText('ISO-8859-1')
mb = new groovy.xml.StreamingMarkupBuilder()
mb.encoding = "UTF-8"

new OutputStreamWriter(new FileOutputStream('c:/temp/myutf8.xml'),'utf-8') << mb.bind {
    mkp.xmlDeclaration()
    out << f
}

这完全不是我想要的...

我只想获取使用ISO-8859-1读取的XML内容,然后将其放入一个新(旧)文件中...为什么这么复杂 :-/

结果应该只是这样,而且文件应该真正采用UTF-8编码:

<?xml version="1.0" encoding="UTF-8" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld>

感谢任何答案 干杯


1
我对Groovy一窍不通,但我假设如果您针对File.getText指定文件的编码,它将自动从该编码转换为您的内部编码。也就是说,只要您的内部编码设置为使用UTF-8,您可能不需要执行任何其他操作。如果我理解有误,请有人纠正我。或者,您得到了哪些确切的错误? - deceze
2个回答

14

让它更加流畅(Groovy),并且不需要将整个文件都放入内存,你可以使用读写器流式传输文件。当我的文件太大了,普通的Unix iconv(1) 无法胜任时,这是我的解决方案。

new FileOutputStream('out.txt').withWriter('UTF-8') { writer ->
    new FileInputStream('in.txt').withReader('ISO-8859-1') { reader ->
        writer << reader
    }
}

1
非常棒的解决方案。我喜欢你使用withReader/Writer的方式。我自己尝试了一下,效果很好 :) - s3v1
谢谢@john-flinchbaugh,这正是我在寻找的!我用它将一个从FTP下载的大文件从iso-8859-15转换为utf-8。效果很好,内存也很安全^^ - Patrick Ferreira

14
def f=new File('c:/data/myiso88591.xml').getText('ISO-8859-1')
new File('c:/data/myutf8.xml').write(f,'utf-8')

(我刚试过了,它可行 :-)

与 Java 相同: 库会为您进行转换... 就像 deceze 所说: 当您指定编码时,它将被转换为内部格式(utf-16 afaik)。当您在写字符串时指定另一个编码时,它将被转换为该编码。

但是,如果您使用 XML,则无论如何都不必担心编码,因为 XML 解析器会处理它。它会读取第一个字符 <?xml 并从这些字符确定基本编码。此后,它能够从您的 XML 标头中读取编码信息并使用此信息。


1
<?xml?这不是在UTF-8、ASCII和其他编码中都一样吗? :) - bzlm
一些 UTF 编码在文件开头使用 BOM。在一些编码中,如 EBCDIC,<?xml 字符不相同。有关详细信息,请参见 http://www.w3.org/TR/xml/#sec-guessing。这非常有趣,也是不创建自己的代码以猜测编码的一个很好的理由。 - rdmueller
2
抱歉,它不正确,但确实有效。 它被存储为:<?xml version="1.0" encoding="ISO-8859-1" ?> <HelloEncodingWorld>ÃöäüÃÃà Test!!!</HelloEncodingWorld> 而显示的编码仍然是ISO-8859-1(使用记事本++)也许第一行强制编辑器将其显示为...啊,好吧,这就是情况,我的天,我已经尝试过这种方式很多次了....但从未意识到数据是以UTF-8编码的,但显示为ANSI...非常感谢。 - Booyeoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接