2010-09-01 11 views
2

Je travaille actuellement sur une application pour valider et analyser des fichiers CSV. Les fichiers CSV doivent être codés en UTF-8, bien que parfois nous obtenions des fichiers dans un faux codage. Les fichiers CSV contiennent probablement des caractères spéciaux de l'alphabet allemand (Ä, Ö, Ü, ß) car la plupart des textes contenus dans le fichier CSV sont en allemand.Java: Détection de caractères non-affichables pour un codage de caractères donné

Pour la partie du validateur, je dois m'assurer que le fichier est codé en UTF-8. Tant qu'il n'y a pas de caractères spéciaux présents, il n'y a probablement aucun problème avec l'analyse syntaxique. Ce que j'ai essayé jusqu'ici est de lire le fichier en octets et d'utiliser certaines bibliothèques pour détecter (ou deviner) l'encodage. J'ai essayé la plupart des possibilités de ce billet de blog: http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

Mais toutes les bibliothèques que j'ai essayées n'ont pas renvoyé l'encodage correct et donc je n'ai pas pu analyser les caractères spéciaux.

Maintenant à ma question: Y at-il un moyen de déterminer pour un encodage de caractères donné comme UTF-8 pour détecter les caractères qui ne sont pas encodés correctement? Donc, fondamentalement, les caractères qui sont affichés dans la console (Eclipse) en tant que marques de quesion.

Ou existe-t-il un autre moyen de déterminer correctement le codage de caractères? J'ai juste besoin de savoir si c'est UTF-8 ou non.

Merci d'avance pour votre aide! :)

Cordialement, Robert

Répondre

5

Les séquences d'octets qui ne peuvent pas être décodés correctement sera remplacé par le « caractère de remplacement », \uFFFD, qui apparaît comme ceci: & # xFFFD ;. Toutefois, si le périphérique de sortie ne prend pas en charge ce caractère, il est susceptible d'utiliser un point d'interrogation (?) À la place. Ainsi, après décodage des données UTF-8 en objets String, recherchez les occurrences \uFFFD.

Si vous définissez un InputStreamReader avec une instance de CharsetDecoder que vous créez vous-même, vous pouvez également obtenir davantage de contrôle. Par exemple, vous pouvez spécifier que si des séquences d'octets ne peuvent pas être décodées, un Exception doit être déclenché. Ou vous pouvez les ignorer. Ou vous pouvez spécifier un caractère différent en tant que caractère de remplacement.

+0

Merci beaucoup, cela a fonctionné parfaitement! –

1

Si le texte est allemand et que le codage n'est pas UTF-8, il s'agit probablement de windows-1252. Ou quelque chose compatible avec Windows-1252, comme ISO-8859-15. Cela étant, le GuessEncoding de Laforge devrait être tout ce dont vous avez besoin. Je l'ai utilisé un peu et n'ai jamais eu de problème, et cela fonctionne presque exclusivement avec du texte en anglais; L'allemand devrait être encore plus facile à détecter.

Je vois qu'il n'a toujours pas spécifié de licence sur son blog ou dans les fichiers sources, mais je sais que ces classes sont utilisées dans Groovy, donc ça ne devrait pas poser de problème.

+0

Merci beaucoup pour vos réponses! Je vais les essayer demain :) –