Ce message est assez ancien, mais je pense pouvoir contribuer à ce problème :
Créez d'abord un script nommé recodeifneeded :
#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")
if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi
Vous pouvez l'utiliser de cette façon :
recodeifneeded utf-8 file.txt
Donc, si vous aimez l'exécuter de manière récursive et changer tous les encodages de fichiers *.txt en (disons) utf-8 :
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
J'espère que cela vous aidera.
Ce script, adapté de l'idée de harrymc, qui recode un fichier de manière conditionnelle (basé sur l'existence de certains caractères scandinaves encodés en UTF-8), semble fonctionner assez bien pour moi.
$ cat recode-to-utf8.sh
#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already
result=`grep -c [åäöÅÄÖ] $1`
if [ "$result" -eq "0" ]
then
echo "Recoding $1 from ISO-8859-1 to UTF-8"
recode ISO-8859-1..UTF-8 $1 # overwrites file
else
echo "$1 was already UTF-8 (probably); skipping it"
fi
(Le traitement de fichiers par lots est bien sûr une simple question, par exemple for f in *txt; do recode-to-utf8.sh $f; done
.)
NB :cela dépend totalement du fait que le fichier de script lui-même est UTF-8. Et comme il s'agit évidemment d'une solution très limitée adaptée au type de fichiers que j'ai, n'hésitez pas à ajouter de meilleures réponses qui résolvent le problème de manière plus générique.
UTF-8 a des règles strictes sur les séquences d'octets valides. Cela signifie que si les données pouvaient être UTF-8, vous obtiendrez rarement des faux positifs si vous supposez que c'est l'est .
Vous pouvez donc faire quelque chose comme ceci (en Python) :
def convert_to_utf8(data):
try:
data.decode('UTF-8')
return data # was already UTF-8
except UnicodeError:
return data.decode('ISO-8859-1').encode('UTF-8')
Dans un script shell, vous pouvez utiliser iconv
pour effectuer la conversion, mais vous aurez besoin d'un moyen de détecter UTF-8. Une façon consiste à utiliser iconv
avec UTF-8 comme encodages source et destination. Si le fichier était valide UTF-8, la sortie sera la même que l'entrée.