138 votes

Problème encodage Java FileReader

J'ai essayé d'utiliser java.io.FileReader de lire des fichiers texte et de les convertir en chaîne de caractères, mais j'ai trouvé le résultat est mal codé et pas lisible du tout.

Voici mon environnement:

  • Windows 2003, codage du système d'exploitation: CP1252

  • Java 5.0

Mes fichiers sont codés en UTF-8 ou CP1252 codé, et certains d'entre eux (codé en UTF-8 fichiers) peuvent contenir des Chinois (non-latine) caractères.

J'utilise le code suivant pour faire mon travail:

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

Le code ci-dessus ne fonctionne pas. J'ai trouvé le FileReader l'encodage est CP1252 même si le texte est codé en UTF-8. Mais la JavaDoc de java.io.FileReader dit que:

Les constructeurs de cette classe assumer que le codage de caractères par défaut et le défaut d'octets taille de la mémoire tampon sont approprié.

Est-ce à dire que je n'ai pas besoin de définir l'encodage de caractères par moi-même si je suis en utilisant FileReader? Mais j'ai eu tort de données codées actuellement, quelle est la bonne façon de traiter avec ma situtaion? Merci.

271voto

Joachim Sauer Points 133411

Oui, vous devez spécifier l'encodage du fichier que vous souhaitez lire.

Oui, cela signifie que vous avez à savoir l'encodage du fichier que vous souhaitez lire.

Non, il n'y a aucun moyen de deviner l'encodage de texte du fichier.

Les constructeurs de FileReader toujours utiliser la plate-forme de codage par défaut qui est généralement une mauvaise idée.

Au lieu de cela, vous devez utiliser new InputStreamReader(new FileInputStream(...), <encoding>).

80voto

Michael Borgwardt Points 181658

``utilise plateforme de Java encodage par défaut, qui dépend des paramètres du système de l’ordinateur, il fonctionne et est généralement l’encodage plus populaires parmi les utilisateurs de ces paramètres régionaux.

Si cette « meilleure estimation » n’est pas correcte, que vous devrez spécifier le codage explicitement. Malheureusement, n’autorise pas cet (oubli majeur dans l’API). Au lieu de cela, vous devez utiliser et idéalement obtenir le codage de métadonnées sur le fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X