33 votes

encodage du fichier shell script

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

58voto

ChristopheD Points 38217

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

9voto

Laurence Gonsalves Points 50783

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".

8voto

Jochen Hilgers Points 917

Vous pouvez utiliser la commande de fichier file --mime myfile.text

4voto

broadband Points 521

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.com

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.

Powered by:

X