web-dev-qa-db-fra.com

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

Il existe de nombreux fichiers texte qui ont été codés dans des jeux de caractères variantes.

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

N'ayant connu que l'encodage d'origine, je peux alors convertir les textes en iconv -f DETECTED_CHARSET -t utf-8.

Existe-t-il un utilitaire permettant de détecter le codage de fichiers en texte brut? Il NE DOIT PAS être parfait à 100%, cela ne me dérange pas s'il y a 100 fichiers mal convertis en 1 000 000 de fichiers.

64
Xiè Jìléi

Essayez le module chardet Python, disponible sur PyPi:

pip install chardet

Ensuite, 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 saisi soit suffisamment long pour permettre une analyse statistique. Lisez le 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ée dans https://superuser.com/a/609056 . Il existe également une version Java quelque part.

50
grawity

Je voudrais utiliser cette commande simple:

encoding=$(file -bi myfile.txt)

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

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

Sous Linux basé sur Debian, le uchardet paquet ( Debian / Ubuntu ) fournit un outil de 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
28
Xavier

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

16
cularis

Pour revenir à 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'}
2
estani

Pour ceux qui utilisent régulièrement Emacs, ils pourraient trouver ce qui suit utile (permet d’inspecter et de valider manuellement le transfert).

De plus, je trouve souvent que la détection automatique du jeu de caractères Emacs est beaucoup plus efficace que les autres outils de détection automatique du jeu de caractères (tels que 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.

2
Yves Lhuillier

UTFCast vaut la peine d'essayer. Cela n'a pas fonctionné 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/

1
Sameer

Mozilla possède une base de code Nice pour la détection automatique 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

1
Martin Hennings

isutf8 (du paquet moreutils) a fait le travail

0
Ronan