36 votes

Deviner l'encodage de texte représenté comme byte[] en Java

Étant donné un tableau d'octets représentant texte inconnu de l'encodage (généralement de l'UTF-8 ou ISO-8859-1, mais pas forcément), quelle est la meilleure façon d'obtenir une estimation la plus probable de l'encodage utilisé (en Java)?

À noter:

  • Aucune autre méta-données est disponible. Le tableau d'octets est littéralement la seule entrée disponible.
  • L'algorithme de détection sera bien évidemment de ne pas être 100 % correct. Si l'algorithme est correct dans plus de 80 % des cas, ce qui est assez bon.

34voto

knorv Points 11421

La méthode suivante permet de résoudre le problème à l'aide de juniversalchardet, qui est un Java port de Mozilla codage de détection de la bibliothèque.

public static String guessEncoding(byte[] bytes) {
    String DEFAULT_ENCODING = "UTF-8";
    org.mozilla.universalchardet.UniversalDetector detector =
        new org.mozilla.universalchardet.UniversalDetector(null);
    detector.handleData(bytes, 0, bytes.length);
    detector.dataEnd();
    String encoding = detector.getDetectedCharset();
    detector.reset();
    if (encoding == null) {
        encoding = DEFAULT_ENCODING;
    }
    return encoding;
}

Le code ci-dessus a été testé et fonctionne comme destiné. Ajoutez simplement juniversalchardet-1.0.3.jar pour le classpath.

J'ai testé les deux juniversalchardet et jchardet. Mon impression générale est que juniversalchardet offre la meilleure précision de la détection et de la plus belle de l'API des deux bibliothèques.

5voto

Thomas Mueller Points 18666

Il est également Apache Tika - une analyse du contenu de la trousse à outils. Il peut deviner le type mime, et il peut deviner l'encodage. Habituellement, la conjecture est correcte avec une très haute probabilité.

4voto

Alan Moore Points 39365

Voici mes préférés: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

Il fonctionne comme ceci:

  • Si il y a un encodage UTF-8 ou UTF-16 BOM, le retour que l'encodage.
  • Si aucun des octets de poids fort bit, retour ASCII (ou vous pouvez le forcer à retourner une valeur par défaut de 8 bits de codage de la place).
  • Si il y a des octets avec le haut-ensemble de bits, mais ils sont disposés dans le bon modèles pour l'UTF-8, le retour de l'UTF-8.
  • Sinon, le retour de la plate-forme de codage par défaut (par exemple, windows-1252 anglais-paramètres régionaux du système Windows).

Cela peut sembler simpliste, mais dans ma journée-à-jour de travail c'est bien plus de 90% de précision.

1voto

Rooke Points 1098

Chi réponse semble la plus prometteuse de l'utilisation réelle. Je veux juste ajouter que, selon Joel Spolsky, Internet Explorer a utilisé une fréquence de base de deviner l'algorithme dans sa journée:

http://www.joelonsoftware.com/articles/Unicode.html

Grosso modo, tout le supposé-à-être-le texte est copié, et analysé dans tous les encodages possibles et imaginables. Selon analyser correspond à une langue moyenne du mot (et à la lettre?) fréquence profil meilleur gagne. Je ne peux pas voir rapidement si jchardet utilise le même type d'approche, j'ai donc pensé que je le mentionne ce juste au cas où.

0voto

Chi Points 8991

Découvrez jchardet

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