<0xEF, 0xBB, 0xBF> Zeichen, das in Dateien angezeigt wird. Wie entferne ich sie?

85

Ich komprimiere JavaScript-Dateien und der Kompressor beschwert sich, dass meine Dateien Zeichen enthalten.

Wie kann ich nach diesen Zeichen suchen und sie entfernen?

Quintin Par
quelle
16
Das ist nicht <U+FEFF>, das ist <0xEF,0xBB,0xBF>die Stückliste von UTF8-Dateien, also sollten Sie den Titel ändern. Wie möchten Sie sie entfernen? Von magischen Feen? Mit dem Kommandozeilen-Tool? Durch einzelnes Bearbeiten? Notepad ++ kann die Codierung ohne Stückliste in UTF8 ändern. Zum Beispiel nur 5 Sekunden "Strip BOM utf8" googeln Ich habe dies für Linux gefunden: ueber.net/who/mjl/projects/bomstrip
xanatos
1
Es kann Ihnen helfen, eine Antwort zu erhalten, die sich speziell auf Ihr Problem bezieht, wenn Sie uns mitteilen, welches Javascript-Tool Sie für die Komprimierung verwenden, auf welcher Plattform und welche anderen Tools Teil Ihres Erstellungsprozesses sind.
SingleNegationElimination
15
Stücklisten in UTF-8 sind absolut grob. Sie müssen den Produzenten dieser Datei finden und ihm sagen, dass er sie mit @ # %% ausschneiden soll.
Tchrist
4
@peterflynn: U+FEFFist der für eine Stückliste verwendete Unicode-Codepunkt, aber die Stückliste selbst gibt an, wie dieser Codepunkt codiert wird (UTF-8 : 0xEF 0xBB 0xBF, UTF-16LE : 0xFF 0xFE, UTF-16BE : 0xFE 0xFF, usw.). Die fraglichen Dateien sind also UTF-8-codiert, was der Kompressor erkennt, wenn er sie in tatsächliche Unicode-Codepunkte decodiert.
Remy Lebeau
4
@xanatos Unabhängig davon, was es ist, manifestiert es sich auf diese Weise, und so können Menschen diese Frage mithilfe von Suchmaschinen leicht finden.
BartoszKP

Antworten:

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

Ich würde annehmen, dass das Tool kaputt geht, wenn Sie andere utf-8 in Ihren Dateien haben, aber wenn nicht, kann Ihnen diese Problemumgehung vielleicht helfen. (Ungetestet ...)

Bearbeiten : Die -CSDOption wurde gemäß dem Kommentar von tchrist hinzugefügt .

Tripleee
quelle
1
Sie müssen mit dem -CSDSchalter oder mit der PERL_UNICODEVariablen auf ausführen SD, damit dies funktioniert.
Tchrist
Regexp funktioniert in Ordnung, wenn <fffe> -Zeichen am Zeilenanfang entfernt werden, um alle <fffe> -Zeichen in einer Zeile zu ersetzen: 's / \ x {fffe} // g'.
Diego Pino
2
Unter Mac perl -CSD -pe 's/^\x{feff}//' file.csvOS X musste ich zu: wechseln . Beachten Sie die Änderung von <fffe> zu <feff>.
mpettis
1
@mpettis Das ist dann keine Stückliste, sondern eine Stückliste mit umgekehrten Bytes. Es kann auf jeder Plattform passieren, wenn Sie UTF-16 in UTF-8 konvertieren und die falsche Bytereihenfolge erhalten (obwohl der Zweck der Stückliste darin besteht, diesen Fehler zu verhindern!)
Tripleee
1
@blong Was ist damit? Stellen Sie eine separate Frage, wenn Sie es nicht herausfinden können (aber es wird wahrscheinlich als Duplikat markiert; erster Google-Hit stackoverflow.com/questions/1712188/… )
Tripleee
185

Sie können sie einfach mit vim entfernen . Hier sind die Schritte:

1) Öffnen Sie in Ihrem Terminal die Datei mit vim:

vim file_name

2) Entfernen Sie alle Stücklistenzeichen :

:set nobomb

3) Speichern Sie die Datei:

:wq
Mohammad Anini
quelle
Diese Lösung hat bei mir funktioniert. Es ist einfacher als die ausgewählte Antwort. Danke
Szydan
Ich habe diese großartige Lösung verwendet, obwohl ich normalerweise ein Emacs-Partisan bin. vim ftw
Ellen Spertus
29

Eine andere Methode, um diese Zeichen zu entfernen - mit Vim :

vim -b Dateiname

Jetzt sind diese "versteckten" Zeichen sichtbar ( <feff>) und können entfernt werden.

ROMANIA_engineer
quelle
19

Vielen Dank für die vorherigen Antworten. Hier ist eine sed (1) -Variante für alle Fälle:

sed '1s/^\xEF\xBB\xBF//'
Michael Shigorin
quelle
1
Andere Quellen schlagen vor, die Zahl 1 wie in "sed '1 s / \ xEF \ xBB \ xBF //'" vor das Muster zu stellen, um nur der ersten Zeile zu entsprechen. Unter Mac OS X funktioniert dies jedoch nicht.
Marian
1
Dies funktionierte und war die beste Lösung für mich. Danke mein Herr!
Vance Lucas
1
Liebte diese Lösung. Am einfachsten zu implementieren und dennoch skalierbar ... :)
Piko
1
@Marian Ein bisschen spät, aber Sie können Masums Antwort überprüfen , die zeigt, warum es auf dem Mac nicht funktioniert hat.
Jemand benutzt Sie immer noch MS-DOS
1
Fügen Sie -i zu sed hinzu, um die Datei (en) mit den Änderungen zu aktualisieren.
Johan
16

Unter Unix / Linux:

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

Unter MacOSX

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

Beachten Sie das $ after sed für Mac.

Unter Windows

Es gibt Super Sed, eine verbesserte Version von sed. Für Windows ist dies eine eigenständige EXE-Datei, die über die Befehlszeile ausgeführt werden kann.

Masum
quelle
1
"Beachten Sie das $ after sed für Mac." - Danke mein Herr!
Jemand benutzt Sie immer noch MS-DOS
1
Die Bash-Zeichenfolge im "C-Stil" $'\xEF\xBB\xBF//'ist eine Bash-Funktion, insbesondere keine Mac- oder OSX-Funktion. Mit diesem Konstrukt analysiert Bash die Escape-Sequenzen in tatsächliche Bytes, bevor die Befehlszeile an übergeben wird sed. Abhängig von Ihrer sedVariante kann dies funktionieren oder auch nicht (obwohl ich sicher bin, dass es für OSX-Benutzer nützlich ist, zu wissen, dass es für sie sofort funktionieren sollte).
Tripleee
1
vielleicht sed -i 's /.../.../'
Arthur
5

Die Verwendung des Schwanzes könnte einfacher sein:

tail --bytes=+4 filename > new_filename
Dzanvu
quelle
1
Diese Technik schlägt fehl, nachdem der Produzent der Datei die Stückliste entfernt hat. Nicht skalierbar ... :)
Piko
3

@ Tripleees Lösung hat bei mir nicht funktioniert. Aber das Ändern der Dateicodierung auf ASCII und erneut auf UTF-8 hat den Trick getan :-)

Pablo Torrecilla
quelle
3

Ich habe dafür Vimgrep verwendet

:vim "[\uFEFF]" *

auch normaler vim Suchbefehl

/[\uFEFF]
Olexiy Zamkoviy
quelle
Hat für mich gearbeitet. Vielen Dank!
Jose Gulisano
2

Der Befehl 'Datei' zeigt an, ob die Stückliste vorhanden ist:

Beispiel: 'Datei myfile.xml' zeigt Folgendes an: "XML 1.0-Dokument, UTF-8-Unicode-Text (mit Stückliste), mit sehr langen Zeilen, mit CRLF-Zeilenabschlüssen"

dos2unix entfernt die Stückliste.

LittletonDoug
quelle
1

In Windows können Sie das Backported Recode- Dienstprogramm von UnxUtils verwenden .

Nikita Koksharov
quelle
1

In Sublime Text können Sie das Highlighter-Paket installieren und dann den regulären Ausdruck in Ihren Benutzereinstellungen anpassen.

Hier habe ich \uFEFFam Ende des highlighter_regexGrundstücks hinzugefügt .

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

Um die Standardpaketeinstellungen zu überschreiben, platzieren Sie die Datei hier:

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

JJD
quelle
1

Ich empfehle die Verwendung des Tools "dos2unix". Bitte testen, um es auszuführen dos2unix ./thefile.js.

Versuchen Sie gegebenenfalls, so etwas für mehrere Dateien zu verwenden:

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

Schöne Grüße.

Wellington1993
quelle
1
Ich mochte Ihre Antwort - bomstripwar auf meinem Mac nicht leicht verfügbar - also nehmen Sie sich Zeit, um Ihnen die einfache Version zu geben:find . -type f -exec dos2unix '{}' +
dsz
0

Speichern Sie die Datei ohne Codesignatur.

Masood Moshref
quelle