web-dev-qa-db-fra.com

Comment supprimer la nomenclature d'un fichier UTF-8?

J'ai un fichier en encodage UTF-8 avec BOM et je souhaite supprimer la BOM. Existe-t-il des outils de ligne de commande Linux pour supprimer la nomenclature du fichier?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
74
m13r

Si vous n'êtes pas sûr si le fichier contient une nomenclature UTF-8, alors cela (en supposant que la mise en œuvre GNU de sed) supprimera la nomenclature si elle existe, ou aucun changement si ce n'est pas le cas.

sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt

Vous pouvez également remplacer le fichier existant par le -i option:

sed -i '1s/^\xEF\xBB\xBF//' orig.txt
84
CSM

Une nomenclature n'a pas de sens en UTF-8. Ceux-ci sont généralement ajoutés par erreur par de faux logiciels sur les systèmes d'exploitation Microsoft.

dos2unix le supprimera et prendra également en charge les autres particularités des fichiers texte Windows.

dos2unix test.xml
72
Stéphane Chazelas

Utilisation de VIM

  1. Ouvrir un fichier dans VIM:

    vi text.xml
    
  2. Supprimer l'encodage de nomenclature:

    :set nobomb
    
  3. Sauvegarder et quitter:

    :wq
    
33
Joshua Pinter

Il est possible de supprimer la nomenclature d'un fichier avec la commande tail:

tail -c +4 withBOM.txt > withoutBOM.txt
28
m13r

Vous pouvez utiliser

LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename

pour supprimer la marque d'ordre des octets du début du fichier, le cas échéant, ainsi que pour convertir tout CR LF sauts de ligne en LF uniquement. Le LANG=C LC_ALL=C indique au shell que vous souhaitez que la commande s'exécute dans les paramètres régionaux C par défaut (également appelés paramètres régionaux POSIX par défaut), où les trois octets formant la marque d'ordre des octets sont traités comme des octets. Le -i option pour sed signifie en place. Si tu utilises -i.old, puis sed enregistre le fichier d'origine sous filename.old, et le nouveau fichier (avec les modifications éventuelles) comme filename.


Personnellement, j'aime avoir ceci comme ~/bin/fix-ms; par exemple, comme

#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
    for FILE in "$@" ; do
        sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
    done
else
    exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi

de sorte que si je dois appliquer cela pour dire tous les fichiers source et en-têtes C (mon ancien code de l'ère MS-DOS, par exemple!), je lance simplement

find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix

ou, si je veux juste regarder un tel fichier, sans le modifier, je peux lancer

~/bin/ms-fix < filename | less

et ne pas voir le laid <U+FEFF> dans mon terminal UTF-8.

5
Nominal Animal

J'utilise un vim one-liner sur le regular pour cela:

vim --clean -c 'se nobomb|wq' filename

vim --clean -c 'bufdo se nobomb|wqa' filename1 filename2 ...
3
Trevor Murdock

Récemment, j'ai trouvé ce petit outil en ligne de commande qui ajoute ou supprime la nomenclature sur des fichiers encodés en UTF-8 arbitraires: TF BOM Utils ( nouveau lien sur github)

Petit inconvénient, vous pouvez télécharger uniquement le code source C++ simple. Vous devez créer le makefile (avec CMake , par exemple) et le compiler vous-même, les binaires ne sont pas fournis sur cette page.

0