Lorsque l’on développe une application, on est souvent amené à lire des fichiers provenant de diverses sources (utilisateurs, autres programmes,…), et dont on ne connaît pas forcément le format, notamment l’encodage.

Java ne fournit pas en standard de moyen de détecter l’encodage d’un fichier, mais grâce aux nombreuses librairies externes disponibles, il est possible de résoudre ce problème.

Nous avons, pour notre part choisi d’utiliser la librairie ICU, développée par IBM, et ce pour plusieurs raisons :

  • c’est une librairie très répandue, et utilisée par de nombreux projets majeurs (gage de sa fiabilité)
  • elle est distribuée sous une licence open source non restrictive, et soutenue par IBM (gage de sa pérennité)
  • nous utilisons BIRT à l’intérieur de notre application, qui dépend lui-même d’ICU, et nous avions donc déjà cette librairie au sein de notre projet.

Voici comment nous l’utilisons dans l’application :

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

String fileName = "...";
final CharsetDetector detector = new CharsetDetector();
detector.setText(new BufferedInputStream (new FileInputStream(fileName)));
Reader fileReader = detector.detect().getReader();

[/pastacode]

En faisant cela, nous obtenons donc un reader classique java, qui nous permettra de lire le fichier sans se préoccuper de l’encodage, et de ne pas avoir de problème avec le traitement des caractères non ASCII.
Dans cet exemple, l’utilisation d’un BufferredInputStream est nécessaire, en effet, ICU va lire une partie du fichier pour déterminer l’encodage, puis revenir au début du fichier grâce à la méthode reset() lorsqu’on lui demande un reader, méthode que l’on ne peut pas utiliser sur un FileInputStream.