¿Por qué Java BufferedReader () no lee correctamente los caracteres en árabe y chino?

Intento leer un archivo que contiene caracteres en inglés y árabe en cada línea y otro archivo que contiene caracteres en inglés y chino en cada línea. Sin embargo, los caracteres de árabe y chino no se muestran correctamente, solo aparecen como signos de interrogación. ¿Alguna idea de cómo puedo resolver este problema?

Aquí está el código que uso para leer:

try { String sCurrentLine; BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile)); int counter = 0; while ((sCurrentLine = br.readLine()) != null) { String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine); System.out.println("The line number "+ counter + " contain : " + sCurrentLine); counter++; } } 

Edición 01

Después de leer la línea y obtener la palabra árabe y china, utilizo una función para traducirlos simplemente buscando el texto árabe dado en una lista de arreglos (que contiene todas las palabras esperadas) (usando el método indexOf ();). Luego, cuando se encuentra el índice de la palabra, se usa para llamar a la palabra en inglés que tiene el mismo índice en otro Arraylist. Sin embargo, esta búsqueda siempre devuelve falso porque falla al buscar los signos de interrogación en lugar de los caracteres en árabe y chino. Entonces, mi impresión System.out.println me muestra nulos, uno por cada error de traducción.

* Estoy usando Netbeans 6.8 Mac versión IDE


Edición 02

Aquí está el código que busca la traducción:

  int testColor = dbColorArb.indexOf(wordToTranslate); int testBrand = -1; if ( testColor != -1 ) { String result = (String)dbColorEng.get(testColor); return result; } else { testBrand = dbBrandArb.indexOf(wordToTranslate); } //System.out.println ("The testBrand is : " + testBrand); if ( testBrand != -1 ) { String result = (String)dbBrandEng.get(testBrand); return result; } else { //System.out.println ("The first null"); return null; } 

De hecho, estoy buscando 2 Arraylists que pueden contener la palabra deseada para traducir. Si no puede encontrarlos en ArrayLists, se devuelve null.


Edición 03

Cuando depuro, encontré que las líneas que se leen se almacenan en mi variable String de la siguiente manera:

  "3;0000000000;0000001001;1996-06-22;;2010-01-27;    ;;01989;      ;" 

Edición 03

El archivo que estoy leyendo me ha sido dado después de que ha sido modificado por otro progtwig (del cual no sé nada al lado de que está hecho en VB) el progtwig hizo que aparecieran las letras árabes que no aparecen correctamente. Cuando revisé la encoding del archivo en Notepad ++, se demostró que es ANSI. sin embargo, cuando lo convierto en UTF8 (que reemplazó la letra en árabe con otro en inglés) y luego lo vuelvo a convertir en ANSI, ¡el árabe se convierte en signos de interrogación!

FileReader javadoc :

Clase de comodidad para leer archivos de caracteres. Los constructores de esta clase asumen que la encoding de caracteres predeterminada y el tamaño predeterminado de byte-buffer son apropiados. Para especificar estos valores usted mismo, construya un InputStreamReader en un FileInputStream.

Asi que:

 Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8"); BufferedReader br = new BufferedReader(reader); 

Si esto aún no funciona, tal vez su consola no esté configurada para mostrar correctamente los caracteres UTF-8. La configuración depende del IDE utilizado y es bastante simple.

Actualización: en el código anterior, reemplace utf-8 con cp1256 . Esto funciona bien para mí (WinXP, JDK6)

Pero recomiendo que insista en que el archivo se genere utilizando UTF-8. Porque cp1256 no funcionará para chino y tendrá problemas similares nuevamente.

Es muy probable que la lectura de la información sea correcta, sin embargo, su flujo de salida probablemente no sea UTF-8, por lo que cualquier carácter que no se pueda mostrar en su juego de caracteres de salida se reemplazará con el ‘?’.

Puedes confirmar esto sacando a cada personaje e imprimiendo el ordinal del personaje.

 public void writeTiFile(String fileName,String str){ try { FileOutputStream out = new FileOutputStream(fileName); out.write(str.getBytes("windows-1256")); } catch (Exception ex) { ex.printStackTrace(); } } 
    Intereting Posts