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!
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!
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 (!)
(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? )
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.
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.
J'ai créé un script basé sur le code de Steven R. Loomis . https://github.com/Vdragon/addUTF-8bomb
Checkout https://github.com/Vdragon/C_CPP_project_template/blob/development/Tools/convertSourceCodeToUTF-8withBOM.bash.sh par exemple pour utiliser ce script.