Verarbeiten Sie eine Datei, die mit einer BOM beginnt (FF FE).

Verarbeiten Sie eine Datei, die mit einer BOM beginnt (FF FE).

Ich habe eine CSV-Datei mit der FF FEStückliste erhalten:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

Beim awkParsen erhalte ich eine Menge Nullbytes, was vermutlich an der Bytereihenfolge liegt. Wie kann ich die Bytereihenfolge dieser Datei ändern (mithilfe der CLI), damit normale Tools damit funktionieren?

Beachten Sie, dass ich glaube, dass diese Datei nur aus ASCII-Zeichen besteht (mit Ausnahme der Stückliste), dies jedoch nicht bestätigen kann, da ich grepglaube, dass es sich um eine Binärdatei handelt:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

Die Suche nach der gleichen Zeichenfolge in VIM zeigtjeder Charakterpassend dazu!

Durch iconvdie Konvertierung in ASCII werden die \x00-Werte nicht gelöscht. Tatsächlich wird das Problem dadurch noch schlimmer, da sie nun wie Nullbytes und nicht wie UTF-8 aussehen!

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

Wie kann ich die Byte-Reihenfolge dieser Datei (mithilfe der CLI) ändern, sodass normale Tools damit funktionieren?

Antwort1

DavonWikipedia-Artikel, FF FEbedeutet UTF16LE. Sie sollten also angeben, von in iconvumzuwandeln :UTF16LEUTF8

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt

Antwort2

dos2unixentfernt auch BOMs und konvertiert UTF-16 in UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unixentfernt auch UTF-8-BOMs:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61

Antwort3

Auch auf StackOverflow beantwortet: Wie kann ich die BOM aus einer UTF-8-Datei entfernen? @ricihat eine gute Antwort.

Kurze Antwort:

  • Kurze Antwort: sed -i $'1s/^\uFEFF//' file.txt, aber nicht auf BSD oder OS/X.
  • Eine andere Antwort: vi file.txt, :set nobomb, :w, einfach, aber manuell
  • Installieren Sie dos2unuix;dos2unix -r file.txt
  • Diese Markierungen können mehrere Bedeutungen haben, einschließlich der einfachen Angabe, dass die Datei UTF-8 ist; sieheWikipedia-Artikel.
  • Windows-Programme fügen diese Markierungen gerne hinzu. Die meisten Editoren entfernen diese Markierungen nicht.

verwandte Informationen