Java les jeux de caractères / encodage des caractères
J'ai un fichier en espagnol donc c'est plein de personnages comme:
á é í ó ú ñ Ñ Á É Í Ó Ú
Je dois lire le fichier, donc ce que je fais:
fr = new FileReader(ficheroEntrada);
BufferedReader rEntrada = new BufferedReader(fr);
String linea = rEntrada.readLine();
if (linea == null) {
logger.error("ERROR: Empty file.");
return null;
}
String delimitador = "[;]";
String[] tokens = null;
List<String> token = new ArrayList<String>();
while ((linea = rEntrada.readLine()) != null) {
//Some parsing specific to my file.
tokens = linea.split(delimitador);
token.add(tokens[0]);
token.add(tokens[1]);
}
logger.info("List of tokens: " + token);
return token;
Quand j'ai lu la liste de jetons, tous les caractères spéciaux sont partis et ont été remplacés par ce genre de personnages:
Ó = Ó
Ñ = Ñ
Et ainsi de suite...
Ce qui se passe? Je n'avais jamais eu de problèmes avec les jeux de caractères (je suppose est un problème de charset). C'est à cause de cet ordinateur? Que puis-je faire?
Supplémentaire conseils seront les bienvenus, je suis en train d'apprendre! Merci!!!!
Utilisation
InputStreamReader
et de spécifier le codage approprié. FileReader
mettra en "par défaut" de l'encodage, afin de ne pas décoder correctement les caractères.OriginalL'auteur coconut | 2012-11-21
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier liées à l'encodage des caractères.
OriginalL'auteur kosa
Les réponses recommander la lecture et de l'écriture en utilisant l'encodage UTF-8 devrait résoudre votre problème. Ma réponse est plus sur ce qui s'est passé et comment diagnostiquer des problèmes similaires à l'avenir.
Le premier endroit pour commencer est de l'UTF-8 table des caractères à http://www.utf8-chartable.de. Il y a un menu déroulant sur la page qui vous permet de parcourir les différentes parties de l'Unicode. L'un de vos problème de caractères est
Ó
. Vérifier le graphique révèle que si votre fichier est encodé en UTF-8, alors le personnage estU+00D3 LATIN CAPITAL LETTER O WITH ACUTE
et l'UTF-8 de la séquence de deux octets, hexc3 93
Maintenant, nous allons vérifier l'ISO-8859-1 jeu de caractères à http://en.wikipedia.org/wiki/ISO/IEC_8859-1, puisque c'est aussi un jeu de caractères populaire. Cependant c'est un de ces caractères sur un octet. Chaque caractère valide est représentée par un seul octet, à la différence de l'UTF-8 d'où un caractère peut être représenté par 1, 2 ou 3 octets.
Noter que le caractère à C3 ressemble à mais il n'y a pas de caractère à 93. Si votre encodage par défaut est probablement pas ISO-8859-1.
Suivant permet de vérifier Windows 1252 à http://en.wikipedia.org/wiki/Windows-1252. C'est presque la même que la norme ISO-8859-1, mais remplit dans certains espaces vides avec des personnages. Et là, nous avons un match. La séquence C3 93 en Windows 1252 est exactement la chaîne de caractères
Ó
Ce que tout cela me dit que le fichier est codé en UTF-8 mais votre environnement Java est configuré avec Windows 1252, comme c'est le codage par défaut. Si vous modifiez votre code pour spécifier explicitement le jeu de caractères ("UTF-8") au lieu d'utiliser la valeur par défaut de votre code seront moins susceptibles d'échouer sur les différents environnements.
Gardez à l'esprit que cela peut avoir aussi facilement qui s'est passé dans l'autre sens. Si vous avez un fichier de texte en espagnol, il pourrait tout aussi facilement un ISO-8859-1 ou Windows 1252 fichier encodé. Dans ce cas, votre code en cours d'exécution sur votre machine ont travaillé d'amende et de commutation pour lire "UTF-8" encoding aurait créé un autre jeu de caractères tronqués.
C'est en partie la raison pour laquelle vous obtenez des avis contradictoires. Différentes personnes ont rencontré différents décalages basée sur leur plate-forme et ont donc découvert les différents correctifs.
Dans le doute, j'ai lu le fichier dans emacs et de passer à hexl-mode afin que je puisse voir le binaire exacte des données dans le fichier. Je suis sûr qu'il y a de mieux et de plus moderne façons de le faire.
Une dernière pensée - c'est peut-être la peine de lire Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!
OriginalL'auteur Guido Simone
Vous avez l'encodage par défaut de mal. Vous avez probablement besoin de lire UTF8 ou latin1. Voir cet extrait de code pour le paramétrage de l'encodage sur les cours d'eau. Voir aussi Java, encodage par défaut
OriginalL'auteur RobAu
Dans mon expérience, le fichier texte doit être lu et écrit basé sur l'Ouest de l'encodage: ISO-8859-1.
BufferedReader rEntrada = new BufferedReader(
new InputStreamReader(new FileInputStream(fr), "ISO-8859-1"));
Vous êtes les bienvenus.Il est bon de savoir que cela fonctionne.
OriginalL'auteur Thinhbk
Autres réponses vous donner une bonne direction. Voulais juste ajouter que Goyave avec ses Les fichiers.newReader(Fichier,Charset) méthode d'assistance rend la création d'un tel BufferedReader beaucoup de lecture (pardonnez le jeu de mots):
OriginalL'auteur ShyJ