GNU/Linux >> Tutoriels Linux >  >> Linux

Comment recoder en UTF-8 conditionnellement ?

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.


Linux
  1. Comment convertir des fichiers en codage UTF-8 sous Linux

  2. Comment gérer les capacités des fichiers Linux

  3. Comment trier un fichier sur place

  4. Comment détecter si un fichier a une nomenclature UTF-8 dans Bash ?

  5. Comment copier un fichier de manière transactionnelle ?

Comment monter un fichier ISO sur Linux

Comment extraire (décompresser) le fichier tar.xz

Comment créer un fichier Tar Gz

Comment décompresser (ouvrir) le fichier Gz

Comment créer un lien symbolique vers un fichier sous Linux

Comment faire écho dans le fichier