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.
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.
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)
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
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'}
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.
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/
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
isutf8
(du paquet moreutils
) a fait le travail