Преобразование 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
}
}