Конвертировать ISO-8859-1 в UTF-8 используя groovy - PullRequest
9 голосов
/ 02 сентября 2011

Мне нужно преобразовать файл 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)

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

это было совсем не то, что я хотел ..

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

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

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

Спасибо за любые ответы Приветствия

Ответы [ 2 ]

12 голосов
/ 02 сентября 2011
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-заголовка и использовать это.

10 голосов
/ 07 сентября 2011

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

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