Обработать файл, начинающийся с BOM (FF FE)

Обработать файл, начинающийся с BOM (FF FE)

Я получил CSV-файл с FF FEспецификацией:

$ 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.|

При использовании awkдля разбора я получаю кучу нулевых байтов, что, как я подозреваю, связано с порядком байтов. Как мне поменять порядок байтов в этом файле (используя CLI), чтобы обычные инструменты могли с ним работать?

Обратите внимание, что я думаю, что этот файл содержит только символы ASCII (за исключением BOM), но я не могу этого подтвердить, так как grepсчитаю, что это двоичный файл:

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

Поиск той же строки в VIM показываеткаждый персонажсоответствие!

Использование iconvпреобразования в ASCII не избавляет от значений \x00, на самом деле это усугубляет проблему, поскольку теперь они выглядят как нулевые байты вместо UTF-8!

$ 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.|

Как поменять порядок байтов в этом файле (используя CLI), чтобы с ним могли работать обычные инструменты?

решение1

Из этогостатья в википедии, FF FEозначает UTF16LE. Поэтому вы должны указать, iconvчтобы преобразовать из UTF16LEв UTF8:

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

решение2

dos2unixтакже удаляет BOM и преобразует UTF-16 в UTF-8:

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

dos2unixтакже удаляет BOM UTF-8:

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

решение3

Также дан ответ на StackOverflow: Как удалить BOM из файла UTF-8? @ричиесть хороший ответ.

Короткий ответ:

  • Короткий ответ: sed -i $'1s/^\uFEFF//' file.txt, но не на BSD или OS/X.
  • Другой ответ: vi file.txt, :set nobomb, :w, простой, но ручной
  • Установить dos2unuix;dos2unix -r file.txt
  • Эти метки имеют несколько возможных значений, включая то, что файл имеет кодировку UTF-8; см.Статья в Википедии.
  • Программы Windows любят добавлять эти метки. Большинство редакторов не удаляют эти метки.

Связанный контент