J'ai besoin de trouver l'encodage de tous les fichiers qui sont placés dans un répertoire. Existe-t-il un moyen de trouver l'encodage utilisé?
La file
commande n'est pas en mesure de le faire.
L'encodage qui m'intéresse est: ISO-8859-1. Si l'encodage est autre chose, je veux déplacer le fichier vers un autre répertoire.
apropos encoding
. Il recherche les titres et les descriptions de toutes les pages de manuel. Quand je fais cela sur ma machine, je vois 3 outils qui pourraient me aider, à en juger par leurs descriptions:chardet
,chardet3
,chardetect3
. Ensuite, en faisantman chardet
et en lisant la page de manuel me dit quechardet
c'est juste l'utilitaire dont j'ai besoin.us-ascii
, mais après avoir ajouté une ligne de commentaire chinois, cela devientutf-8
.file
peut dire l'encodage en lisant le contenu du fichier et devinez.Réponses:
Cela ressemble à ce que vous recherchez
enca
. Il peut deviner et même convertir entre les encodages. Regardez la page de manuel .Ou, à défaut, utilisez
file -i
(linux) oufile -I
(osx). Cela produira des informations de type MIME pour le fichier, qui comprendra également l'encodage du jeu de caractères. J'ai aussi trouvé une page de manuel pour ça :)la source
enca
semble être complètement inutile pour analyser un fichier écrit en anglais, mais si vous regardez quelque chose en estonien, cela pourrait résoudre tous vos problèmes. Outil très utile, qui ... </Si vous aimez le faire pour un tas de fichiers
la source
Do not prepend filenames to output lines
file -b --mime-encoding
uniquement l'encodage du jeu de caractèresuchardet - Une bibliothèque de détecteurs d'encodage portée depuis Mozilla.
Usage:
Diverses distributions Linux (Debian / Ubuntu, OpenSuse-packman, ...) fournissent des binaires.
la source
sudo apt-get install uchardet
c'est si facile que j'ai décidé de ne pas m'en inquiéter ...uchardet
a un gros avantage surfile
etenca
, en ce qu'il analyse le fichier entier (juste essayé avec un fichier 20GiB) par opposition au seul début.voici un exemple de script utilisant le fichier -I et iconv qui fonctionne sur MacOsX Pour votre question, vous devez utiliser mv au lieu de iconv
la source
file -b --mime-encoding
ne produit que le jeu de caractères, vous pouvez donc éviter tout traitement de tuyauIl est vraiment difficile de déterminer s'il s'agit de l'iso-8859-1. Si vous avez un texte avec seulement 7 caractères binaires qui pourrait également être iso-8859-1 mais vous ne savez pas. Si vous avez des caractères à 8 bits, les caractères de la région supérieure existent également dans l'ordre des codages. Pour cela, vous devrez utiliser un dictionnaire pour mieux deviner de quel mot il s'agit et déterminer à partir de là quelle lettre il doit être. Enfin, si vous détectez que ce pourrait être utf-8, vous êtes sûr que ce n'est pas iso-8859-1
L'encodage est l'une des choses les plus difficiles à faire car vous ne savez jamais si rien ne vous dit
la source
Dans Debian, vous pouvez également utiliser
encguess
:la source
uchardet
dans Ubuntu et il m'a dit que mon fichier l'étaitWINDOWS-1252
. Je sais que c'était faux parce que je l'ai enregistré en UTF-16 avec Kate, pour le tester. Cependant,encguess
devinez correctement, et il a été préinstallé dans Ubuntu 19.04.Pour convertir le codage de 8859 en ASCII:
la source
Avec Python, vous pouvez utiliser le module chardet: https://github.com/chardet/chardet
la source
Ce n'est pas quelque chose que vous pouvez faire à toute épreuve. Une possibilité serait d'examiner chaque caractère du fichier pour s'assurer qu'il ne contient aucun caractère dans les plages
0x00 - 0x1f
ou0x7f -0x9f
mais, comme je l'ai dit, cela peut être vrai pour n'importe quel nombre de fichiers, y compris au moins une autre variante d'ISO8859.Une autre possibilité consiste à rechercher des mots spécifiques dans le fichier dans toutes les langues prises en charge et à voir si vous pouvez les trouver.
Ainsi, par exemple, recherchez l'équivalent de l'anglais "et", "mais", "à", "de" et ainsi de suite dans toutes les langues prises en charge de 8859-1 et voyez si elles ont un grand nombre d'occurrences dans le fichier.
Je ne parle pas de traduction littérale comme:
bien que ce soit possible. Je parle de mots communs dans la langue cible (pour autant que je sache, l'islandais n'a pas de mot pour "et" - vous devrez probablement utiliser leur mot pour "poisson" [désolé, c'est un peu stéréotypé, je ne l'ai pas signifie toute infraction, illustrant simplement un point]).
la source
Je sais que vous êtes intéressé par une réponse plus générale, mais ce qui est bon en ASCII est généralement bon dans d'autres encodages. Voici une ligne unique en Python pour déterminer si l'entrée standard est ASCII. (Je suis sûr que cela fonctionne en Python 2, mais je ne l'ai testé que sur Python 3.)
la source
Si vous parlez de fichiers XML (ISO-8859-1), la déclaration XML à l'intérieur d'eux spécifie l'encodage:
<?xml version="1.0" encoding="ISO-8859-1" ?>
Ainsi, vous pouvez utiliser des expressions régulières (par exemple avec
perl
) pour vérifier chaque fichier pour une telle spécification.Vous trouverez plus d'informations ici: Comment déterminer le codage d'un fichier texte .
la source
En php, vous pouvez vérifier comme ci-dessous:
Spécification explicite de la liste d'encodage:
"Mb_list_encodings" plus précis:
Ici, dans le premier exemple, vous pouvez voir que j'ai mis une liste d'encodages (détecter l'ordre des listes) qui pourraient correspondre. Pour avoir un résultat plus précis, vous pouvez utiliser tous les encodages possibles via: mb_list_encodings ()
Remarque: les fonctions mb_ * nécessitent php-mbstring
la source
Chez Cygwin, cela semble fonctionner pour moi:
Exemple:
Vous pouvez diriger cela vers awk et créer une commande iconv pour tout convertir en utf8, à partir de n'importe quel encodage source pris en charge par iconv.
Exemple:
la source
Vous pouvez extraire l'encodage d'un seul fichier avec la commande file. J'ai un fichier sample.html avec:
sample.html: document HTML, texte Unicode UTF-8, avec de très longues lignes
Document HTML, texte Unicode UTF-8, avec de très longues lignes
text / html; charset = utf-8
utf-8
la source
J'utilise le script suivant pour
.
la source
avec cette commande:
vous pouvez lister tous les fichiers dans un répertoire et des sous-répertoires et l'encodage correspondant.
la source
Avec Perl, utilisez Encode :: Detect.
la source