Comment vérifier l'encodage d'un fichier dans un shell script ? J'ai besoin de savoir si un fichier est encodé en utf-8 ou en iso-8859-1.
Merci
Comment vérifier l'encodage d'un fichier dans un shell script ? J'ai besoin de savoir si un fichier est encodé en utf-8 ou en iso-8859-1.
Merci
J'utiliserais juste
file -bi myfile.txt
pour déterminer le codage des caractères d'un fichier particulier.
Une solution avec une dépendance externe mais je suspecte file
est très courante de nos jours parmi toutes les distros semi-modernes.
EDITAR:
En réponse au commentaire de Laurence Gonsalves : b
est l'option pour être 'bref' (ne pas inclure le nom du fichier) et i
est l'équivalent abrégé de --mime
donc le moyen le plus portable (y compris Mac OSX) est probablement celui-là :
file --mime myfile.txt
Il n'y a aucun moyen d'être sûr à 100% (à moins que vous n'ayez affaire à un format de fichier qui indique en interne son codage).
La plupart des outils qui tentent de faire cette distinction essaieront de décoder le fichier en utf-8 (car c'est l'encodage le plus strict) et, en cas d'échec, de revenir à iso-8859-1. Vous pouvez le faire avec iconv
"à la main", ou vous pouvez utiliser file
:
$ file utf8.txt
utf8.txt: UTF-8 Unicode text
$ file latin1.txt
latin1.txt: ISO-8859 text
Notez que les fichiers ASCII sont compatibles à la fois avec UTF-8 et ISO-8859-1.
$ file ascii.txt
ascii.txt: ASCII text
Enfin, il n'y a pas de véritable moyen de faire la distinction entre ISO-8859-1 et ISO-8859-2, par exemple, à moins de partir du principe qu'il s'agit d'un langage naturel et d'utiliser des méthodes statistiques. C'est probablement pour cela que le fichier dit "ISO-8859".
La commande du fichier n'est pas sûre à 100%. Test simple :
#!/bin/bash
echo "a" > /tmp/foo
for i in {1..1000000}
do
echo "asdas" >> /tmp/foo
done
echo "üöäÄÜÖß " >> /tmp/foo
file -b --mime-encoding /tmp/foo
ces sorties :
us-ascii
Ascii ne connaît pas les trémas allemands.
Le fichier est un ensemble d'octets (séquence d'octets). Sans faire confiance aux méta-données (BOM seulement recommandé pour utf-16 et utf-32, MIME, en-tête de données) vous ne pouvez pas vraiment détecter l'encodage. La séquence d'octets peut être interprétée comme utf-8 ou ISO-8859-1/2 ou tout ce que vous voulez. Cela dépend pour une certaine séquence si la carte iso-8850-1/utf-8 existe. Ce que vous voulez, c'est encoder le contenu entier du fichier dans l'encodage de caractères désiré. Si cela échoue, c'est que l'encodage souhaité n'a pas de carte pour cette séquence d'octets.
En shell, vous pouvez utiliser python, perl ou, comme le dit Laurence Gonsalves, iconv. Pour les fichiers texte, j'utilise ceci en python :
f = codecs.open(path, encoding='utf-8', errors='strict')
def valid_string(str):
try:
str.decode('utf-8')
return True
except UnicodeDecodeError:
return False
Comment savez-vous qu'un fichier est un fichier texte ? Vous ne le faites pas. Vous encodez ligne par ligne avec l'encodage de caractères désiré. Ok, vous pouvez ajouter un peu de confiance et vérifier si la nomenclature existe (le fichier est encodé utf).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.