Преобразование ISO-8859-1 в UTF-8 с помощью groovy

мне нужно преобразовать в ISO-8859-1 файл в кодировке UTF-8, без потери intormations содержание...

у меня есть файл, который выглядит так:

<?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)

не работал из-за несовместимости строк. Затем я прочитал что-то о 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
}

это было совсем не то, что я желаемый..

Я просто хочу получить содержимое xml-чтения с помощью считывателя ISO-8859-1, а затем поместить его в новый (старый) файл... почему это так сложно :-/

результат должен быть просто, и файл должен быть действительно закодирован в utf-8:

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

Спасибо за любые ответы Ура!--5-->

2 ответов


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 и использовать это.


что делает его немного более заводным и не требует, чтобы весь файл помещался в память, вы можете использовать читателей и писателей для потоковой передачи файла. Это было мое решение, когда у меня были файлы слишком большие для простого старого Unix iconv(1).

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