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.