87 votes

Comment détecter automatiquement l'encodage d'un fichier texte ?

Il existe de nombreux fichiers de texte brut qui ont été encodés dans des jeux de caractères différents.

Je veux les convertir tous en UTF-8, mais avant d'exécuter iconv, je dois connaître son encodage d'origine. La plupart des navigateurs ont un Auto Detect dans les encodages, cependant, je ne peux pas vérifier ces fichiers texte un par un car ils sont trop nombreux.

Seulement en connaissant l'encodage original, je peux alors convertir les textes en iconv -f DETECTED_CHARSET -t utf-8 .

Existe-t-il un utilitaire permettant de détecter l'encodage des fichiers de texte brut ? Il n'est pas nécessaire qu'il soit parfait à 100%, cela ne me dérange pas s'il y a 100 fichiers mal codés dans 1 000 000 de fichiers.

76voto

James Mertz Points 390

Essayez le chardet module Python, qui est disponible sur PyPI :

pip install chardet

Ensuite, exécutez chardetect myfile.txt .

Chardet est basé sur le code de détection utilisé par Mozilla, il devrait donc donner des résultats raisonnables, à condition que le texte d'entrée soit suffisamment long pour permettre une analyse statistique. Lisez bien le la documentation du projet .

Comme mentionné dans les commentaires, c'est assez lent, mais certaines distributions fournissent également la version originale C++, comme @Xavier l'a trouvé en https://superuser.com/a/609056 . Il existe également une version Java quelque part.

39voto

J'utiliserais cette simple commande :

encoding=$(file -bi myfile.txt)

Ou si vous voulez juste le jeu de caractères actuel (comme utf-8 ) :

encoding=$(file -b --mime-encoding myfile.txt)

33voto

Xavier Points 474

Sur un Linux basé sur Debian, le uchardet paquet ( Debian / Ubuntu ) fournit un outil en ligne de commande. Voir ci-dessous la description du paquet :

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html

17voto

mickburkejnr Points 177

Pour Linux, il y a enca et pour Solaris, vous pouvez utiliser auto_ef .

2voto

TKD Points 1

Mozilla dispose d'une base de code intéressante pour l'autodétection dans les pages Web :
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

Description détaillée de l'algorithme :
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X