2011-09-02 12 views
9

Ho bisogno di convertire un file ISO-8859-1 di codifica UTF-8, senza perdere intormations contenuti ...Convert ISO-8859-1 a UTF-8 usando Groovy

Ho un file che sembra this:

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

Non voglio codificarlo in UTF-8. Ho provato seguente:

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) 

non funzionava a causa di incompatibilità String. poi ho letto qualcosa a proposito bytestreamreaders/scrittori/streamingmarkupbuilder e altro ...

poi ho provato

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 
} 

questo non era del tutto che ciò che volevo ..

voglio solo per ottenere il il contenuto di un xml letto con un lettore ISO-8859-1 e poi lo mise in un nuovo (vecchio) file ... perché questo è così complicato: -/

Il risultato dovrebbe essere solo, e il file dovrebbe essere veramente codificato in utf-8:

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

Grazie per eventuali risposte Acclamazioni

+1

non ho la prima idea di Groovy, ma suppongo che se si specifica la codifica del file per 'File.getText', sarà convertito da che codifica automaticamente per la codifica interna. Cioè probabilmente non è necessario fare nient'altro se la codifica interna è impostata per utilizzare UTF-8. Qualcuno mi corregge se sono fuori pista qui. In alternativa, quali sono gli errori esatti che ottieni? – deceze

risposta

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

(ho appena dato una prova, funziona :-)

stesso come in Java: le biblioteche fanno la conversione per voi. .. come decreto diceva: quando si specifica una codifica, verrà convertito in un formato interno (utf-16 afaik). Quando specifichi un'altra codifica quando scrivi la stringa, questa verrà convertita in questa codifica.

Ma se lavori con XML, non dovresti preoccuparti della codifica comunque perché il parser XML si prenderà cura di esso. Legge i primi caratteri <?xml e determina la codifica di base di quei caratteri. Dopo di ciò, è in grado di leggere le informazioni di codifica dall'intestazione xml e usarlo.

+1

' bzlm

+0

Alcune codifiche UTF avviano il file con una BOM. E in alcune codifiche come ebcdic, i caratteri ' rdmueller

+2

Scusa ma non è giusto, che funzioni davvero. E 'conservato in questo modo: ' ÃöäüÃÃà prova !!!' e la codifica che viene mostrato è ancora ISO-8859-1 (usando notepad ++) Forse la prima riga costringe l'editor a mostrarlo come ... ahh ok questo era il caso, omg, ho già provato così spesso ... ma mai ho capito che i dati erano codificati in utf 8 ma mostrati come ansi ... grazie mille. – Booyeoo

8

Rendendolo un po 'più Groovy e non richiedendo l'intero file per adattarlo alla memoria, è possibile utilizzare i lettori e i writer per lo streaming del file. Questa era la mia soluzione quando avevo file troppo grandi per il vecchio vecchio Unix iconv(1).

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

Soluzione molto groovy. Mi piace il modo in cui usi withReader/Writer. L'ho provato anch'io e ha funzionato benissimo :) –