J'ai essayé d'utiliser java.io.FileReader pour lire certains fichiers texte et les convertir en une chaîne, mais j'ai trouvé que le résultat était mal encodé et pas du tout lisible.
Voici mon environnement:
Windows 2003, encodage du système d'exploitation: CP1252
Java 5.0
Mes fichiers sont codés UTF-8 ou CP1252, et certains d'entre eux (fichiers codés UTF-8) peuvent contenir des caractères chinois (non latins).
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é que l'encodage de FileReader est CP1252 même si le texte est encodé UTF-8. Mais le JavaDoc de java.io.FileReader dit que:
Les constructeurs de cette classe supposent que le codage de caractères par défaut et la taille par défaut du tampon d'octets sont appropriés.
Cela signifie-t-il que je ne suis pas obligé de définir moi-même le codage des caractères si j'utilise FileReader? Mais j'ai actuellement des données mal encodées, quelle est la bonne façon de gérer ma situation? Merci.
Réponses:
Oui, vous devez spécifier le codage du fichier que vous souhaitez lire.
Oui, cela signifie que vous devez connaître le codage du fichier que vous souhaitez lire.
Non, il n'existe aucun moyen général de deviner le codage d'un fichier "texte brut" donné.
Les constructeurs à un argument
FileReader
utilisent toujours le codage par défaut de la plateforme, ce qui est généralement une mauvaise idée .Depuis Java 11
FileReader
a également gagné des constructeurs qui acceptent un encodage:new FileReader(file, charset)
etnew FileReader(fileName, charset)
.Dans les versions antérieures de java, vous devez utiliser .
new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
la source
InputStreamReader
s'agit d'unejava.io
classe, ce serait "UTF8"?StandardCharsets.UTF_8
qu'il n'y a aucune chance de se tromper ;-) Mais oui, si vous y allez avec une chaîne, ce"UTF8"
serait correct (bien que je semble me souvenir que cela acceptera les deux sens).Byte Order Mark
, avec .. eh bien .. établir l'ordre des octets! :) En tant que tel, je trouve étrange que FileReader de Java ne soit pas capable de détecter automatiquement UTF-16 qui a une telle nomenclature ... En fait, j'ai déjà écrit unUnicodeFileReader
qui fait exactement cela. Malheureusement source fermée, mais Google a son UnicodeReader qui est très similaire.FileReader
utilise le codage par défaut de la plate-forme Java, qui dépend des paramètres système de l'ordinateur sur lequel il s'exécute et est généralement le codage le plus populaire parmi les utilisateurs de cette locale.Si cette "meilleure estimation" n'est pas correcte, vous devez spécifier le codage explicitement. Malheureusement,
FileReader
ne permet pas cela (omission majeure dans l'API). Au lieu de cela, vous devez utilisernew InputStreamReader(new FileInputStream(filePath), encoding)
et idéalement obtenir le codage à partir des métadonnées du fichier.la source
FileReader
utilise le codage par défaut de la plate-forme Java, qui dépend des paramètres système de l'ordinateur sur lequel il s'exécute et est généralement le codage le plus populaire parmi les utilisateurs de cette locale." Je ne dirais pas ça. Au moins de Windows. Pour des raisons techniques / historiques étranges, la JVM ignore le fait qu'Unicode est l' encodage recommandé sur Windows pour `` toutes les nouvelles applications '' et agit à la place toujours comme si l'encodage hérité configuré comme solution de secours pour les applications héritées était le `` par défaut de la plate-forme ''.Depuis Java 11, vous pouvez utiliser cela:
la source
Pour Java doc vous pouvez utiliser ceci:
Voici tous les documents sur les jeux de caractères
Par exemple, si votre fichier est en CP1252, utilisez cette méthode
Voici d'autres noms canoniques pour les encodages Java à la fois pour IO et NIO doc
Si vous ne savez pas avec l'encodage exact que vous avez dans un fichier, vous pouvez utiliser des bibliothèques tierces comme cet outil de Google, ce qui fonctionne assez bien.
la source
FileInputStream avec InputStreamReader est mieux que d'utiliser directement FileReader, car ce dernier ne vous permet pas de spécifier un jeu de caractères d'encodage.
Voici un exemple utilisant BufferedReader, FileInputStream et InputStreamReader ensemble, afin que vous puissiez lire les lignes d'un fichier.
la source
Pour une autre langue latine par exemple cyrillique, vous pouvez utiliser quelque chose comme ceci:
et assurez-vous que votre
.txt
fichier est enregistré au formatUTF-8
(mais pas par défautANSI
). À votre santé!la source