Carattere <0xEF, 0xBB, 0xBF> visualizzato nei file. Come rimuoverli?


86

Sto comprimendo i file JavaScript e il compressore si lamenta del fatto che i miei file contengono caratteri.

Come posso cercare questi personaggi e rimuoverli?


16
Cioè <U+FEFF>, questa è <0xEF,0xBB,0xBF>la distinta base dei file UTF8, quindi dovresti cambiare il titolo. Come vorresti rimuoverli? Dalle fate magiche? Con uno strumento da riga di comando? Modificando uno per uno? Notepad ++ può modificare la codifica in UTF8 senza BOM. Ad esempio, cercando su
Google

1
Potrebbe aiutarti a ottenere una risposta che si riferisce specificamente al tuo problema se ci dicessi quale strumento JavaScript stai utilizzando per eseguire la compressione, su quale piattaforma e quali altri strumenti fanno parte del tuo processo di creazione.
SingleNegationElimination

15
Le distinte base in UTF-8 sono assolutamente rozze. Devi trovare il produttore di quel file e dirgli di tagliarlo @ # %%.
tchrist

4
@peterflynn: U+FEFFè il codepoint Unicode utilizzato per una BOM, ma la BOM stessa è il modo in cui quel codepoint è codificato (UTF-8 0xEF 0xBB 0xBF:, 0xFF 0xFEUTF-16LE:, UTF-16BE:, 0xFE 0xFFecc.). Quindi i file in questione sono codificati UTF-8, che il compressore rileva quando li decodifica in punti di codice Unicode effettivi.
Remy Lebeau

4
@xanatos Indipendentemente da cosa sia, è così che si manifesta ed è così che le persone possono trovare facilmente questa domanda utilizzando i motori di ricerca.
BartoszKP

Risposte:


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

Presumo che lo strumento si rompa se hai altri utf-8 nei tuoi file, ma in caso contrario, forse questa soluzione alternativa può aiutarti. (Non testato ...)

Modifica : aggiunta l' -CSDopzione, come da commento di tchrist.


1
È necessario eseguire con l' -CSDinterruttore o con l' PERL_UNICODEinvariabile impostato su SD, affinché funzioni.
tchrist

Regexp funziona bene per rimuovere il carattere <fffe> all'inizio di una riga, per sostituire tutti i caratteri <fffe> in una riga: 's / \ x {fffe} // g'.
Diego Pino

2
Su Mac OSX, ho dovuto cambiare in perl -CSD -pe 's/^\x{feff}//' file.csv:, notare il passaggio da <fffe> a <feff>.
mpettis

1
@mpettis Allora non è una BOM, ma una BOM con i byte invertiti. Potrebbe accadere su qualsiasi piattaforma, se converti UTF-16 in UTF-8 e ottieni l'ordine dei byte errato (anche se lo scopo del BOM è prevenire
quell'errore

1
@blong Che ne dici? Fai una domanda separata, se non si può capire (ma probabilmente sarà contrassegnata come duplicata; prima google colpo stackoverflow.com/questions/1712188/... )
tripleee

185

Puoi rimuoverli facilmente usando vim , ecco i passaggi:

1) Nel tuo terminale, apri il file usando vim:

vim file_name

2) Rimuovi tutti i caratteri BOM :

:set nobomb

3) Salva il file:

:wq

Questa soluzione ha funzionato per me. È più semplice della risposta selezionata. Grazie
szydan

Ho usato questa ottima soluzione anche se normalmente sono un partigiano di emacs. vim ftw
Ellen Spertus

30

Un altro metodo per rimuovere quei caratteri - usando Vim :

vim -b fileName

Ora quei caratteri "nascosti" sono visibili ( <feff>) e possono essere rimossi.


20

Grazie per le risposte precedenti, ecco una variante sed (1) per ogni evenienza:

sed '1s/^\xEF\xBB\xBF//'

1
Altre fonti suggeriscono di anteporre la cifra 1 allo schema, come in "sed '1 s / \ xEF \ xBB \ xBF //'", per far corrispondere solo la prima riga. Tuttavia, per me su Mac OS X, nessuno dei due modi funziona.
Marian

1
Ha funzionato ed è stata la soluzione migliore per me. Grazie Signore!
Vance Lucas

1
Mi è piaciuta questa soluzione. Più facile da implementare e ancora scalabile ... :)
Piko

1
@Marian Un po 'in ritardo, ma puoi controllare la risposta di Masum che mostra perché non ha funzionato su Mac.
Qualcuno ti usa ancora MS-DOS

1
Aggiungi -i a sed per aggiornare i file con le modifiche.
Johan

17

Su Unix / Linux:

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

Su MacOSX

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

Notare il $ dopo sed per mac.

Su Windows

C'è Super Sed, una versione migliorata di sed. Per Windows si tratta di un file .exe autonomo, concepito per l'esecuzione dalla riga di comando.


1
"Nota il $ dopo sed per mac." - Grazie Signore!
Qualcuno ti usa ancora MS-DOS

1
La stringa "C-style" di $'\xEF\xBB\xBF//'Bash è una caratteristica di Bash, non particolarmente una caratteristica di Mac o OSX. Con questo comando, Bash analizzerà le sequenze di escape in byte effettivi prima di passare la riga di comando a sed. A seconda della sedvariante, questo potrebbe funzionare o meno (anche se sono sicuro che sia utile per gli utenti OSX sapere che dovrebbe funzionare immediatamente per loro).
tripleee

1
forse sed -i 's /.../.../'
Arthur

6

Usare la coda potrebbe essere più semplice:

tail --bytes=+4 filename > new_filename

1
Questa tecnica fallirà dopo che il produttore del file rimuove la distinta materiali. Non scalabile ... :)
Piko

4

La soluzione di @ tripleee non ha funzionato per me. Ma cambiare la codifica del file in ASCII e di nuovo in UTF-8 ha funzionato :-)


3

Ho usato vimgrep per questo

:vim "[\uFEFF]" *

anche il normale comando di ricerca di vim

/[\uFEFF]

2

Il comando 'file' mostra se la BOM è presente:

Ad esempio: "file myfile.xml" visualizza: "documento XML 1.0, testo UTF-8 Unicode (con BOM), con righe molto lunghe, con terminatori di riga CRLF"

dos2unix rimuoverà la BOM.



1

In Sublime Text puoi installare il pacchetto Evidenziatore e quindi personalizzare l'espressione regolare nelle impostazioni dell'utente.

Qui ho aggiunto \uFEFFalla fine della highlighter_regexproprietà.

{
    "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
}

Per sovrascrivere le impostazioni predefinite del pacchetto, posizionare il file qui:

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


1

Suggerisco di utilizzare lo strumento "dos2unix", per favore prova a farlo funzionare dos2unix ./thefile.js.

Se necessario, prova a utilizzare qualcosa di simile per più file:

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

I miei saluti.


1
Mi è piaciuta la tua risposta - bomstripnon era facilmente disponibile sul mio Mac - quindi find . -type f -exec dos2unix '{}' +
prenditi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.