Pourquoi Java BufferedReader () pas en train de lire les caractères arabes et chinois correctement?

StackOverflow https://stackoverflow.com/questions/2260325

  •  20-09-2019
  •  | 
  •  

Question

Je suis en train de lire un fichier contenant des caractères anglais et arabe sur chaque ligne et un autre fichier qui contient l'anglais et les caractères chinois sur chaque ligne. Cependant, les caractères de l'arabe et le chinois ne parviennent pas à afficher correctement - ils apparaissent comme des points d'interrogation. Toute idée comment je peux résoudre ce problème?

Voici le code que j'utilise pour la lecture:

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++;
        }
    }

Edition 01

Après avoir lu la ligne et obtenir le mot arabe et chinois j'utiliser une fonction pour les traduire en recherchant simplement texte donné arabe dans un ArrayList (qui contiennent tous les mots attendus) (en utilisant indexOf () ; méthode). Puis, quand se trouve il est utilisé l'index du mot pour appeler le mot anglais qui a le même indice dans un autre Arraylist. Cependant cette recherche renvoie toujours faux car il échoue lors de la recherche des points d'interrogation à la place des caractères arabes et chinois. Donc, mon impression System.out.println me montre les valeurs NULL un pour chaque échec à traduire.

* J'utilise Netbeans 6.8 Mac Version IDE


Edition 02

Voici le code qui recherche la traduction:

        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;
        }

Je cherche en fait 2 ArrayLists qui pourrait contenir le mot désiré à traduire. Si elle ne parvient pas à les trouver dans les deux ArrayLists, alors NULL est renvoyée.


Edition 03

Quand je debug je trouve que les lignes en cours de lecture sont stockés dans ma variable de chaîne comme suit:

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

Edition 03

Le fichier je lis m'a été donné après qu'il a été modifié par un autre programme (que je ne sais rien à côté est fait en VB) le programme a les lettres arabes qui ne sont pas correctement apparaître leur apparition. Lorsque j'ai vérifié l'encodage du fichier sur Notepad ++, il a montré qu'il est ANSI. Mais quand je le convertir en UTF8 (qui a remplacé la lettre arabe avec d'autres Anglais un), puis reconvertir en ANSI les points d'interrogation deviennent arabes!

Était-ce utile?

La solution

FileReader javadoc :

  

classe pratique pour la lecture des fichiers de caractères. Les constructeurs de cette classe supposent que le caractère de codage par défaut et la taille par défaut octet du tampon sont appropriées. Pour définir ces valeurs vous-même, construire un InputStreamReader sur un FileInputStream.

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

Si cela ne fonctionne toujours pas, alors peut-être votre console n'est pas réglé pour afficher correctement les caractères UTF-8. Configuration dépend de l'IDE utilisé et est assez simple.

Mise à jour: Dans le code ci-dessus remplacer utf-8 avec cp1256. Cela fonctionne bien pour moi (Windows XP, JDK6)

Mais je vous recommande que vous insistez sur le fichier généré en utilisant UTF-8. Parce que cp1256 ne fonctionnera pas pour le chinois et vous aurez encore des problèmes similaires.

Autres conseils

Il est très probable lecture de l'information correctement, mais votre flux de sortie est probablement pas UTF-8, et ainsi un caractère qui ne peut pas être montré dans votre caractère de sortie ensemble est remplacé par le « ? ».

Vous pouvez confirmer en sortir chaque caractère et l'impression de l'ordinal de caractère.

public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top