clase java file unicode encoding

clase filereader java



Problema de codificación Java FileReader (2)

Traté de usar java.io.FileReader para leer algunos archivos de texto y convertirlos en una cadena, pero encontré que el resultado está mal codificado y no se puede leer en absoluto.

Aquí está mi entorno:

  • Windows 2003, codificación del sistema operativo: CP1252

  • Java 5.0

Mis archivos están codificados en UTF-8 o codificados en CP1252, y algunos de ellos (archivos codificados en UTF-8) pueden contener caracteres chinos (no latinos).

Uso el siguiente código para hacer mi trabajo:

private static String readFileAsString(String filePath) throws java.io.IOException{ StringBuffer fileData = new StringBuffer(1000); FileReader reader = new FileReader(filePath); //System.out.println(reader.getEncoding()); BufferedReader reader = new BufferedReader(reader); char[] buf = new char[1024]; int numRead=0; while((numRead=reader.read(buf)) != -1){ String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } reader.close(); return fileData.toString(); }

El código anterior no funciona. Encontré que la codificación del FileReader es CP1252, incluso si el texto está codificado en UTF-8. Pero el JavaDoc de java.io.FileReader dice que:

Los constructores de esta clase asumen que la codificación de caracteres predeterminada y el tamaño predeterminado de byte-buffer son apropiados.

¿Esto significa que no estoy obligado a establecer la codificación de caracteres por mi mismo si estoy usando FileReader? Pero obtuve datos codificados incorrectos actualmente, ¿cuál es la forma correcta de lidiar con mi situtaion? Gracias.


Sí, necesita especificar la codificación del archivo que desea leer.

Sí, esto significa que debe conocer la codificación del archivo que desea leer.

No, no hay una forma general de adivinar la codificación de ningún archivo de "texto sin formato".

Los constructores de FileReader siempre usan la codificación predeterminada de la plataforma, que generalmente es una mala idea .

En lugar de FileReader, necesita usar el new InputStreamReader( new FileInputStream(pathToFile) , <encoding>) .


FileReader utiliza la codificación predeterminada de plataforma de Java, que depende de la configuración del sistema de la computadora en la que se ejecuta y generalmente es la codificación más popular entre los usuarios de esa localidad.

Si esta "mejor suposición" no es correcta, entonces debe especificar la codificación explícitamente. Desafortunadamente, FileReader no permite esto (supervisión mayor en la API). En su lugar, debe usar el new InputStreamReader(new FileInputStream(filePath), encoding) e idealmente obtener la codificación de los metadatos sobre el archivo.