Pregunta

Estoy intentando leer un archivo que contienen caracteres en inglés y árabe en cada línea y otro archivo que contiene Inglés y caracteres chinos en cada línea. Sin embargo, los caracteres del árabe y el chino no muestran correctamente - que sólo aparecen como signos de interrogación. Cualquier idea de cómo puedo solucionar este problema?

Aquí está el código que utilizo para la lectura:

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 conseguir la árabe y la palabra china que utiliza una función de traducirlos por la simple búsqueda de Dada texto árabe en un ArrayList (que contienen todas las palabras esperadas) (usando indexOf () ; método). Luego, cuando se encuentra el índice de la palabra se utiliza para llamar a la palabra Inglés, que tiene el mismo índice en otro Arraylist. Sin embargo esta búsqueda siempre devuelve falsa porque no la hora de buscar los signos de interrogación en lugar de los caracteres árabes y chinos. Así que mi impresión System.out.println me muestra los nulos, una por cada falta de traducción.

* estoy usando Netbeans 6.8 Mac versión IDE


Edición 02

Aquí está el código que la búsqueda de 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;
        }

En realidad estoy buscando 2 ArrayLists que podría contener el la palabra deseada a traducir. Si no logra encontrar en ambos ArrayLists, se devuelve nulo.


Edición 03

Cuando elimino errores me encontré con que se está leyendo las líneas se almacenan en mi variable de cadena como el siguiente:

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

Edición 03

El archivo que estoy leyendo se ha dado a mí después de que ha sido modificado por otro programa (que no sé nada de al lado que está hecha en VB) del programa hizo que las letras árabes que no aparecen correctamente en aparecer. Cuando me registré la codificación del archivo en Notepad ++ se demostró que es ANSI. sin embargo cuando convertirlo en UTF-8 (que sustituyó a la letra árabe con otra Inglés uno) y luego convertirlo de nuevo a ANSI los árabes convertido en signos de interrogación!

¿Fue útil?

Solución

FileReader javadoc :

  

clase de conveniencia para la lectura de archivos de carácter. Los constructores de esta clase asumen que la codificación de caracteres por defecto y el tamaño de byte de búfer predeterminado son las adecuadas. Para especificar estos valores a ti mismo, construir un InputStreamReader en un FileInputStream.

Así que:

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

Si esto no funciona, entonces tal vez la consola no está configurado para mostrar correctamente caracteres UTF-8. Configuración depende del IDE utilizado y es bastante simple.

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

Pero te recomiendo que usted insiste en el archivo que se genera con UTF-8. Debido cp1256 no funcionará para los chinos y que tendrá problemas similares de nuevo.

Otros consejos

Lo más probable es la lectura de la información de forma correcta, sin embargo, su flujo de salida probablemente no es UTF-8, por lo que cualquier carácter que no se pueden mostrar en su conjunto de caracteres de salida está siendo reemplazado por el '?'.

Se puede confirmar esto consiguiendo cada personaje e imprimir el carácter ordinal.

public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top