2011-09-02 28 views
9

muszę przekonwertować plik ISO-8859-1 na UTF-8, bez utraty intormations treści ...Konwersja ISO-8859-1 na UTF-8 za pomocą Groovy

Mam plik, który wygląda jak to:

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

Nie chcę kodować go do UTF-8. Próbowałem następujące:

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) 

nie działał z powodu niekompatybilności Smyczkowych. Potem przeczytałem coś o bytestreamreaders/pisarze/streamingmarkupbuilder i inne ...

następnie próbowałem

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 
} 

to nie był całkowicie to, co chciałem ..

Chcę tylko, aby uzyskać zawartość xml czytana z czytnikiem ISO-8859-1, a następnie umieszczana w nowym (starym) pliku ... dlaczego jest to tak skomplikowane: -/

Wynik powinien być po prostu, a plik powinien być naprawdę zakodowane w utf-8:

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

Dzięki za wszelkie odpowiedzi Cheers

+1

Nie mam pojęcia o pierwszej Groovy, ale zakładam, że jeśli określić kodowanie pliku dla 'File.getText', zostanie on przekształcony z kodowanie do twojego wewnętrznego kodowania automatycznie. To znaczy. prawdopodobnie nie musisz robić nic więcej, o ile twoje wewnętrzne kodowanie jest ustawione na używanie UTF-8. Ktoś mnie poprawi, jeśli nie jestem tutaj. Alternatywnie, jakie są dokładne błędy, które otrzymujesz? – deceze

Odpowiedz

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

(ja po prostu spróbowaliśmy to działa :-)

sam jak w Java: biblioteki zrobić konwersję dla Ciebie. .. jako deceze powiedział: kiedy określisz kodowanie, zostanie on przekonwertowany do formatu wewnętrznego (utf-16 afaik). Kiedy określisz inne kodowanie podczas pisania łańcucha, zostanie on przekonwertowany na to kodowanie.

Ale jeśli pracujesz z XML, nie powinieneś martwić się kodowaniem, ponieważ analizator składni XML zajmie się tym. Przeczyta pierwsze znaki <?xml i określa podstawowe kodowanie tych znaków. Następnie jest w stanie odczytać informacje o kodowaniu z twojego nagłówka xml i użyć tego.

+1

' bzlm

+0

Niektóre kodowania UTF uruchamiają plik z zestawieniem komponentów. W niektórych kodowaniach, takich jak ebcdic, znaki ' rdmueller

+2

Przepraszam, ale to nie w porządku, że to naprawdę działa. Jest przechowywany w następujący sposób: ' öäüüÃà Test !!!' i kodowanie co jest pokazane jest nadal ISO-8859-1 (używając notatnika ++) Może pierwsza linia zmusza redaktora do pokazania go jako ... ahh ok, to było w tym przypadku, omg, już próbowałem tak często ... ale nigdy zdałem sobie sprawę, że dane zostały zakodowane w utf 8, ale pokazane jako ansi ... wielkie dzięki. – Booyeoo

8

Trochę bardziej Groovy, i nie wymagając, aby cały plik pasował do pamięci, możesz użyć czytników i piszących do streamowania pliku. To było moje rozwiązanie, gdy miałem zbyt duże pliki na stary Unix iconv(1).

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

Bardzo fajne rozwiązanie. Podoba mi się sposób korzystania z narzędzia withReader/Writer. Sam go wypróbowałem i zadziałało świetnie :) –