web-dev-qa-db-fra.com

Ajout de nomenclature à des fichiers UTF-8

Je cherche (sans succès) un script qui fonctionnerait comme un fichier de commandes et me permettrait d'ajouter un fichier texte UTF-8 avec une nomenclature s'il n'en avait pas.

Ni le langage dans lequel il est écrit (Perl, python, c, bash) ni le système d'exploitation sur lequel il fonctionne ne m'importent. J'ai accès à un large éventail d'ordinateurs.

J'ai trouvé beaucoup de scripts pour faire l'inverse (effacer la nomenclature), ce qui me semble idiot, car de nombreux programmes Windows auront des difficultés à lire les fichiers texte UTF-8 s'ils n'ont pas de nomenclature.

Ai-je oublié l'évidence?

Merci!

33
Stephane

J'ai écrit ce addbom.sh en utilisant la commande 'file' et la commande ICU 's' uconv '.

#!/bin/sh

if [ $# -eq 0 ]
then
        echo usage $0 files ...
        exit 1
fi

for file in "$@"
do
        echo "# Processing: $file" 1>&2
        if [ ! -f "$file" ]
        then
                echo Not a file: "$file" 1>&2
                exit 1
        fi
        TYPE=`file - < "$file" | cut -d: -f2`
        if echo "$TYPE" | grep -q '(with BOM)'
        then
                echo "# $file already has BOM, skipping." 1>&2
        else
                ( mv "${file}" "${file}"~ && uconv -f utf-8 -t utf-8 --add-signature < "${file}~" > "${file}" ) || ( echo Error processing "$file" 1>&2 ; exit 1)
        fi
done

edit: Ajout de guillemets autour des arguments mv. Merci @DirkR et content que ce script ait été si utile!

41
Steven R. Loomis

Le moyen le plus simple que j'ai trouvé pour cela est 

#!/usr/bin/env bash

#Add BOM to the new file
printf '\xEF\xBB\xBF' > with_bom.txt

# Append the content of the source file to the new file
cat source_file.txt >> with_bom.txt

Je sais qu'il utilise un programme externe (chat) ... mais il fera le travail facilement en bash

Testé sur osx mais devrait fonctionner aussi sur linux

NOTE que cela suppose que le fichier n'a pas déjà BOM (!)

25
Yaron U.

(Réponse basée sur https://stackoverflow.com/a/9815107/1260896 by yingted)

Pour ajouter des nomenclatures à tous les fichiers qui commencent par "foo-", vous pouvez utiliser sed. sed a une option pour faire une sauvegarde.

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' foo-*

Si vous savez avec certitude qu'il n'y a pas déjà de nomenclature, vous pouvez simplifier la commande:

sed -i '1s/^/\xef\xbb\xbf/' foo-*

Assurez-vous que vous devez définir UTF-8, car c’est-à-dire que UTF-16 est différent (sinon, vérifiez Comment puis-je rajouter un marqueur d’ordre des octets Unicode dans Linux? )

10
Franklin Piat

Je trouve ça assez simple. En supposant que le fichier est toujours UTF-8 (vous ne détectez pas le codage, vous savez le codage):

Lire les trois premiers caractères. Comparez-les à la séquence de nomenclature UTF-8 (wikipedia indique que c'est 0xEF, 0xBB, 0xBF) . Si c'est la même chose, imprimez-les dans le nouveau fichier, puis copiez tout le reste du fichier d'origine dans le nouveau fichier .Si c'est différent, commencez par imprimer la nomenclature, puis les trois caractères, puis tout ce qui reste du fichier d'origine dans le nouveau fichier.

En C, fopen/fclose/fread/fwrite devrait suffire.

4
luiscubal

Pour améliorer la solution de Yaron U., vous pouvez tout faire sur une seule ligne:

printf '\xEF\xBB\xBF' | cat - source.txt > source-with-bom.txt

Le bit cat - indique de concaténer au début de source.txt ce qui est acheminé à partir de la commande print. Testé sur OS X et Ubuntu.

2
Trenton
0
Vdragon