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

Boo*_*eoo 10 groovy encoding utf-8 iso-8859-1

我需要将ISO-8859-1文件转换为utf-8编码,而不会丢失内容的修改......

我有一个看起来像这样的文件:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld>
Run Code Online (Sandbox Code Playgroud)

我不想将其编码为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)
Run Code Online (Sandbox Code Playgroud)

由于String不兼容而无法正常工作.然后我读了一些关于bytestreamreaders/writers/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
}
Run Code Online (Sandbox Code Playgroud)

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

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

结果应该是,并且文件应该在utf-8中真正编码:

<?xml version="1.0" encoding="UTF-8" ?> 
<HelloEncodingWorld>Üöäüßßß Test!!!</HelloEncodingWorld>
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何答案干杯

rdm*_*ler 14

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

(我只是试一试,它有效:-)

与java中的相同:库为您进行转换...如deceze所说:当您指定编码时,它将转换为内部格式(utf-16 afaik).在编写字符串时指定其他编码时,它将转换为此编码.

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

  • 对不起,但它不对,它确实有效.它存储如下:`<?xml version ="1.0"encoding ="ISO-8859-1"?> <HelloEncodingWorld>ÃÃÃüÃÃÃÃÃ测试!!! </ HelloEncodingWorld>`并且显示的编码是仍然是ISO-8859-1(使用记事本++)也许第一行强制编辑器将其显示为......啊,好吧这就是那种情况,omg,我已经经常尝试过这种方式......但是从未意识到数据以utf 8编码,但显示为ansi ...非常感谢. (2认同)

Joh*_*ugh 10

使它更加Groovy,并且不要求整个文件适合内存,您可以使用读者和编写器来传输文件.这是我的解决方案,当我的文件对于普通的旧Unix来说太大了iconv(1).

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