2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74
74

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 de lancer iconv, je dois connaître son encodage d'origine. La plupart des navigateurs ont une option Auto Detect dans les encodages, cependant, je ne peux pas vérifier ces fichiers texte un par un car ils sont trop nombreux.

N'ayant connu que le codage d'origine, je peux alors convertir les textes par iconv -f DETECTED_CHARSET -t utf-8.

Existe-t-il un utilitaire pour détecter le codage des fichiers texte en clair ? Il n'est pas nécessaire qu'il soit parfait à 100%, cela ne me dérange pas s'il y a 100 fichiers mal convertis en 1.000.000 de fichiers.

Réponses (9)

62
62
62
2011-06-24 08:37:06 +0000

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

pip install chardet

Puis lancez 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 une analyse statistique. Veuillez lire la documentation du projet .

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

30
30
30
2013-06-18 12:44:37 +0000

Sous Linux basé sur Debian, le paquet uchardet 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
16
16
16
2011-06-24 08:38:40 +0000

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

2
2
2
2013-10-11 16:06:44 +0000

Mozilla a une belle base de code pour l'auto-dé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

2
2
2
2018-11-06 15:42:35 +0000

Pour ceux qui utilisent régulièrement Emacs, les éléments suivants peuvent leur être utiles (ils permettent d'inspecter et de valider manuellement la transfomation).

De plus, je trouve souvent que l'auto-détection des jeux de caractères d'Emacs est beaucoup plus efficace que les autres outils d'auto-détection des jeux de caractères (comme le chardet).

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

Ensuite, un simple appel à Emacs avec ce script en argument (voir l'option “-l”) fait le travail.

1
1
1
2015-10-28 17:34:06 +0000

isutf8 (du paquet moreutils) a fait le travail

1
1
1
2014-01-23 16:12:16 +0000

Pour en revenir au chardet (python 2. ?), cet appel pourrait suffire :

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Bien que ce soit loin d'être parfait….

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
1
1
1
2011-09-03 00:48:04 +0000

L'UTFCast vaut la peine d'être essayé. Ça n'a pas marché pour moi (peut-être parce que mes fichiers sont terribles) mais ça a l'air bien. http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

0
0
0
2019-07-12 16:39:09 +0000

Aussi dans le cas où vous déposez -i vous donne

Vous pouvez utiliser cette commande php qui peut deviner le charset comme ci-dessous :

En php vous pouvez vérifier comme ci-dessous :

En spécifiant explicitement la liste de codage :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Plus précis “ mb_list_encodings” :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Ici dans le premier exemple, vous pouvez voir que j'ai mis une liste d'encodages (ordre de la liste de détection) qui pourraient correspondre. Pour obtenir un résultat plus précis, vous pouvez utiliser tous les encodages possibles via : mb_list_encodings()

Note : les fonctions mb_* nécessitent une php-mbstring

apt-get install php-mbstring

Voir la réponse : https://stackoverflow.com/a/57010566/3382822