Supprimer récursivement tous les BOM de vos fichiers UTF-8 en un script

Travaillant sur un vieux projet PHP, j’ai été confronté à de vieux fichiers cradingues encodés en UTF-8 AVEC BOM, posant des problèmes d’affichages et de redirections.

Le BOM, si vous ne savez pas ce que c’est, c’est un caractère se situant généralement en début de fichier servant à déterminer en quel type d’UTF est encodé un fichier (UTF-8, 16, 32, autres ?). Ce marqueur n’étant pas nécessaire en UTF-8, il nous pose plus de problèmes qu’autre chose et l’on a pour habitude de l’omettre.

Après quelques recherches, je suis tombé sur des bouts de scripts sur le forum d’Ubuntu, mais ils modifient tous les fichiers présents. J’ai des fichiers encodés en latin9 parmi ceux à corriger, mon but n’est pas de les changer :-/

Du coup, je me suis créé un script bash qui cherche et corrige seulement les fichiers présentant cette particularité, le voici :

#!/bin/bash
FROM=UTF-8
TO=UTF-8
ICONV="iconv -f $FROM -t $TO"
BASEDIR=${1:-.}

# Convert
grep -rl $'\xEF\xBB\xBF' "$BASEDIR" | while read fn;
do
    $ICONV "$fn" > "$fn".bak
    awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' "$fn".bak > "$fn"
    rm "$fn".bak
    echo "$fn"
done

Un petit chmod +x sur ce script, vous l’exécutez en passant en paramètre le dossier contenant les fichiers à fixer et c’est fini 😀

Continuer la lecture