2010-06-10 71 views
10

tengo un archivo que tiene algunos caracteres que no son utf8 (como "ISO-8859-1"), y entonces quiero convertir ese archivo (o leer) a la codificación UTF8, ¿Cómo puedo hacerlo?java: cómo convertir un archivo a utf8

El código es así:

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

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

... 

edición: Ponga un ejemplo de codificación

+0

No UTF8? ¿Quieres reducir eso un poco? Es fácil una vez que conoces la codificación de entrada, y esencialmente imposible si no lo haces. –

+0

algunas consideraciones, los archivos son GRANDES (como 1GB) así que no puedo ponerlos en un objeto String ... –

+0

¿cuál es la codificación de su archivo? Si está en Linux o OS X (y otro Un * x) puede simplemente escribir: * file some_file * y le dirá la codificación. Por cierto, si tienes Un * x (al menos tanto Linux y OS X), deberías tener la línea de comando * iconv *. * "man iconv" * dice: * "Convertir la codificación de archivos dados de una codificación a otra" *, lo que posiblemente hará un mejor trabajo en un archivo de 1GB que una herramienta Java auto escrita. Tenga en cuenta que la codificación UTF-8 puede representar todos los puntos de código Unicode, por lo que dice que el archivo * "tiene algunos caracteres que no son utf8" * suena dudoso ... – NoozNooz42

Respuesta

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) { 
    .... 
    } 

Allí tienen el texto decodificado. Puede escribirlo, mediante los métodos Simmetric Writer/OutputStream, con la codificación que prefiera (por ejemplo, UTF-8).

+0

No es necesario leer línea por línea – OscarRyz

+2

por supuesto que no, es solo una manera posible. – leonbloy

+0

el problema potencial con la lectura línea por línea es que puede alterar terminaciones de línea/separaciones. Por ejemplo, si la última línea no tiene final de línea, agregará una. –

1

Sólo desea leerlo como UTF-8? Lo que hice recientemente con un problema similar es iniciar la JVM con -Dfile.encoding = UTF-8 y leer/imprimir de forma normal. No sé si eso es aplicable en su caso.

Con esa opción:

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

imprime correctamente los caracteres. De lo contrario, imprime un? símbolo

+2

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

+0

@McD: iba a publicar el mismo comentario. Esta es una mala interpretación del uso del '-Dfile.encoding'. – BalusC

+0

Veo, realmente es un desastre. – Ismael

4

Necesita conocer la codificación del archivo de entrada. Por ejemplo, si el archivo está en Latin-1, que haría algo como esto,

 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

Resumido: ** léalo ** en la propia codificación del archivo y luego ** escríbalo ** en la nueva codificación. – BalusC

14

El siguiente código convierte un archivo de 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--

Usando Try-con-recursos (Java 7):

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 mi comentario, tienes razón.Por cierto, no he visto este estilo de cierre en finalmente antes. Inteligente. – BalusC