2010-06-10 19 views
10

ho un file che ha alcuni caratteri non utf8 (come "ISO-8859-1"), e quindi voglio convertire quel file (o leggere) in codifica UTF8, come posso farlo?java: come convertire un file in utf8

Il codice è come questo:

File file = new File("some_file_with_non_utf8_characters.txt"); 

/* some code to convert the file to an utf8 file */ 

... 

edit: Mettere un esempio di codifica

+0

non-UTF8? Vuoi restringere un po 'questo? È facile una volta che conosci la codifica di input, ed essenzialmente impossibile se non lo fai. –

+0

alcune considerazioni, i file sono BIG (come 1GB) quindi non posso metterli in un oggetto String ... –

+0

qual è la codifica del tuo file? Se sei su Linux o OS X (e altri Un * x) puoi semplicemente digitare: * file some_file * e ti dirà la codifica. A proposito, se stai su Un * x (almeno su Linux e OS X), dovresti avere la riga di comando * iconv *. * "man iconv" * dice: * "Converti la codifica dei file dati da una codifica a un'altra" *, che probabilmente farà un lavoro migliore su un file da 1 GB rispetto a un programma Java auto-scritto. Notare che la codifica UTF-8 può rappresentare ogni singolo punto di codice Unicode, quindi dire che il file * "ha alcuni caratteri non-utf8" * sembra dubbio ... – NoozNooz42

risposta

8
String charset = "ISO-8859-1"; // or what corresponds 
    BufferedReader in = new BufferedReader( 
     new InputStreamReader (new FileInputStream(file), charset)); 
    String line; 
    while((line = in.readLine()) != null) { 
    .... 
    } 

Ecco il testo decodificato. Puoi scriverlo, con i metodi simmetrici di Writer/OutputStream, con la codifica che preferisci (es. UTF-8).

+0

Non è necessario leggere riga per riga – OscarRyz

+2

ovviamente no, è solo un modo posible. – leonbloy

+0

il potenziale problema con la lettura riga per riga è che è possibile modificare le desinenze/separazioni delle linee. Ad esempio, se l'ultima riga non ha fine riga, ne verrà aggiunta una. –

1

Si desidera solo di leggerlo come UTF-8? Quello che ho fatto di recente con un problema simile è quello di avviare la JVM con -Dfile.encoding = UTF-8 e leggere/stampare normalmente. Non so se sia applicabile nel tuo caso.

Con questa opzione:

System.out.println("á é í ó ú") 

stampata correttamente i caratteri. Altrimenti stampa un? symbol

+2

http : //bugs.sun.com/view_bug.do? bug_id = 4163515 – McDowell

+0

@McD: stavo per pubblicare lo stesso commento. Questa è un'interpretazione errata dell'uso di '-Dfile.encoding'. – BalusC

+0

Vedo, è davvero un casino. – Ismael

4

È necessario conoscere la codifica del file di input. Ad esempio, se il file è in Latin-1, si potrebbe fare qualcosa di simile,

 FileInputStream fis = new FileInputStream("test.in"); 
     InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1"); 
     Reader in = new BufferedReader(isr); 
     FileOutputStream fos = new FileOutputStream("test.out"); 
     OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); 
     Writer out = new BufferedWriter(osw); 

     int ch; 
     while ((ch = in.read()) > -1) { 
      out.write(ch); 
     } 

     out.close(); 
     in.close(); 
+2

Riepilogato: ** leggi ** nella codifica del file e poi ** scrivi ** nella nuova codifica. – BalusC

14

Il codice seguente converte un file da srcEncoding a tgtEncoding:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    BufferedReader br = null; 
    BufferedWriter bw = null; 
    try{ 
     br = new BufferedReader(new InputStreamReader(new FileInputStream(source),srcEncoding)); 
     bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); 
     char[] buffer = new char[16384]; 
     int read; 
     while ((read = br.read(buffer)) != -1) 
      bw.write(buffer, 0, read); 
    } finally { 
     try { 
      if (br != null) 
       br.close(); 
     } finally { 
      if (bw != null) 
       bw.close(); 
     } 
    } 
} 

--EDIT--

Utilizzando (Java 7) risorse Try-con-:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    try (
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding)); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding));) { 
      char[] buffer = new char[16384]; 
      int read; 
      while ((read = br.read(buffer)) != -1) 
       bw.write(buffer, 0, read); 
    } 
} 
+2

Ignora il mio commento, hai ragione.Btw, non ho visto questo stile di chiusura finalmente prima. Intelligente. – BalusC