<0xEF, 0xBB, 0xBF> caractère apparaissant dans les fichiers. Comment les supprimer?

86

Je suis en train de compresser des fichiers JavaScript et le compresseur se plaint que mes fichiers contiennent du caractère.

Comment puis-je rechercher ces caractères et les supprimer?

Quintin Par
la source
16
Ce n'est pas <U+FEFF>, c'est <0xEF,0xBB,0xBF>la nomenclature des fichiers UTF8, vous devez donc changer le titre. Comment souhaitez-vous les supprimer? Par des fées magiques? Par l'outil de ligne de commande? En éditant un par un? Notepad ++ peut changer le codage en UTF8 sans BOM. Par exemple, en googlant 5 secondes de "strip BOM utf8", j'ai trouvé ceci pour Linux: ueber.net/who/mjl/projects/bomstrip
xanatos
1
Cela pourrait vous aider à obtenir une réponse spécifiquement liée à votre problème si vous nous indiquiez quel outil javascript vous utilisez pour effectuer la compression, sur quelle plate-forme et quels autres outils font partie de votre processus de construction.
SingleNegationElimination
15
Les nomenclatures en UTF-8 sont absolument grossières. Vous devez trouver le producteur de ce fichier et lui dire de le couper en @ # %%.
tchrist le
4
@peterflynn: U+FEFFest le point de code Unicode utilisé pour une nomenclature, mais la nomenclature elle-même est la façon dont ce point de code est codé (UTF-8 :, 0xEF 0xBB 0xBFUTF-16LE 0xFF 0xFE:, UTF-16BE:, 0xFE 0xFFetc.). Les fichiers en question sont donc encodés en UTF-8, ce que le compresseur détecte lors de leur décodage en points de code Unicode réels.
Remy Lebeau
4
@xanatos Indépendamment de ce que c'est, c'est ainsi que cela se manifeste, et c'est ainsi que les gens peuvent facilement trouver cette question à l'aide des moteurs de recherche.
BartoszKP

Réponses:

18
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

Je suppose que l'outil se cassera si vous avez d'autres utf-8 dans vos fichiers, mais sinon, cette solution de contournement peut peut-être vous aider. (Non testé ...)

Edit : ajout de l' -CSDoption, selon le commentaire de tchrist.

tripleee
la source
1
Vous devez exécuter avec le -CSDcommutateur, ou avec la valeur PERL_UNICODEenvariable définie sur SD, pour que cela fonctionne.
tchrist le
Regexp fonctionne bien pour supprimer le caractère <fffe> au début d'une ligne, pour remplacer tous les caractères <fffe> dans une ligne: 's / \ x {fffe} // g'.
Diego Pino du
2
Sous Mac OSX, j'ai dû passer à perl -CSD -pe 's/^\x{feff}//' file.csv:, notez le changement de <fffe> à <feff>.
mpettis le
1
@mpettis Ce n'est donc pas une nomenclature, mais une nomenclature avec les octets inversés. Cela peut arriver sur n'importe quelle plate-forme, si vous convertissez UTF-16 en UTF-8 et que l'ordre des octets est erroné (même si le but de la nomenclature est d'éviter cette erreur!)
tripleee
1
@blong Et ça? Posez une question distincte si vous ne pouvez pas la comprendre (mais elle sera probablement marquée comme un doublon; premier hit google stackoverflow.com/questions/1712188/… )
tripleee
185

Vous pouvez facilement les supprimer à l'aide de vim , voici les étapes:

1) Dans votre terminal, ouvrez le fichier en utilisant vim:

vim file_name

2) Supprimez tous les caractères de la nomenclature :

:set nobomb

3) Enregistrez le fichier:

:wq
Mohammad Anini
la source
Cette solution a fonctionné pour moi. C'est plus simple que la réponse choisie. Merci
szydan
J'ai utilisé cette excellente solution même si je suis normalement un partisan d'emacs. vim ftw
Ellen Spertus
30

Une autre méthode pour supprimer ces caractères - en utilisant Vim :

vim -b nom_fichier

Maintenant, ces caractères "cachés" sont visibles ( <feff>) et peuvent être supprimés.

ROMANIA_engineer
la source
20

Merci pour les réponses précédentes, voici une variante sed (1) au cas où:

sed '1s/^\xEF\xBB\xBF//'
Michael Shigorin
la source
1
D'autres sources suggèrent d'ajouter le chiffre 1 au motif, comme dans "sed '1 s / \ xEF \ xBB \ xBF //'", pour ne correspondre qu'à la première ligne. Cependant, pour moi sur Mac OS X, aucune des deux méthodes ne fonctionne.
Marian
1
Cela a fonctionné et était la meilleure solution pour moi. Merci Monsieur!
Vance Lucas
1
J'ai adoré cette solution. Le plus simple à mettre en œuvre et toujours évolutif ... :)
Piko
1
@Marian Un peu tard, mais vous pouvez vérifier la réponse de Masum qui montre pourquoi cela n'a pas fonctionné sur mac.
Quelqu'un vous utilise toujours MS-DOS
1
Ajoutez -i à sed pour mettre à jour le (s) fichier (s) avec les modifications.
Johan
17

Sous Unix / Linux:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

Sur MacOSX

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

Notez le $ après sed pour mac.

Sous Windows

Il y a Super Sed une version améliorée de sed. Pour Windows, il s'agit d'un .exe autonome, destiné à être exécuté à partir de la ligne de commande.

Masum
la source
1
"Notez le $ après sed pour mac." - Merci Monsieur!
Quelqu'un vous utilise toujours MS-DOS
1
La chaîne Bash "C-style" $'\xEF\xBB\xBF//'est une fonctionnalité Bash, pas particulièrement une fonctionnalité Mac ou OSX. Avec cette structure, Bash analysera les séquences d'échappement en octets réels avant de passer la ligne de commande à sed. Selon votre sedvariante, cela peut ou non fonctionner (même si je suis sûr qu'il est utile pour les utilisateurs d'OSX de savoir que cela devrait fonctionner immédiatement pour eux).
tripleee du
1
peut-être sed -i 's /.../.../'
Arthur
6

Utiliser tail pourrait être plus simple:

tail --bytes=+4 filename > new_filename
Dzanvu
la source
1
Cette technique échouerait après que le producteur du fichier supprime la nomenclature. Not scalable ... :)
Piko
4

La solution de @ tripleee n'a pas fonctionné pour moi. Mais changer le codage du fichier en ASCII et à nouveau en UTF-8 a fait l'affaire :-)

Pablo Torrecilla
la source
3

J'ai utilisé vimgrep pour cela

:vim "[\uFEFF]" *

commande de recherche vim également normale

/[\uFEFF]
Olexiy Zamkoviy
la source
2

La commande 'fichier' indique si la nomenclature est présente:

Par exemple: 'file myfile.xml' affiche: "Document XML 1.0, texte UTF-8 Unicode (avec nomenclature), avec de très longues lignes, avec terminateurs de ligne CRLF"

dos2unix supprimera la nomenclature.

LittletonDoug
la source
1

Dans Windows , vous pouvez utiliser rétroportés recodage utilitaire à partir UnxUtils .

Nikita Koksharov
la source
1

Dans Sublime Text, vous pouvez installer le package Highlighter, puis personnaliser l'expression régulière dans vos paramètres utilisateur.

Ici j'ai ajouté \uFEFFà la fin de la highlighter_regexpropriété.

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

Pour remplacer les paramètres par défaut du package, placez le fichier ici:

~ / .config / sublime-text-3 / Packages / User / highlighter.sublime-settings

JJD
la source
1

Je suggère l'utilisation de l'outil "dos2unix", veuillez tester pour l'exécuter dos2unix ./thefile.js.

Si nécessaire, essayez d'utiliser quelque chose comme ceci pour plusieurs fichiers:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

Mes salutations.

Wellington1993
la source
1
J'ai aimé votre réponse - bomstripn'était pas facilement disponible sur mon mac - alors prenez le temps de vous donner la version simple:find . -type f -exec dos2unix '{}' +
dsz
0

Enregistrez le fichier sans signature de code.

Masood Moshref
la source