Обработка файла, который начинается с спецификации (FF FE)

10

Я получил файл .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 (за исключением спецификации), но я не могу подтвердить это, так как 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), чтобы с ним работали обычные инструменты?

dotancohen
источник
Файл CSV, который вы создали в Windows или Mac?
Cuonglm
Можете ли вы дать часть файла?
Cuonglm
Вот ссылка на анонимную часть файла, которая сохраняет уникальные проблемы с ним. Спасибо!
dotancohen

Ответы:

16

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

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
cuonglm
источник
Отлично спасибо! Я перепутал спецификации UTF-8 и UTF-16: я думал, что FFFE и FEFF были UTF-8, и я никогда не знал спецификации UTF-16. На самом деле, это спецификации UTF-16, и я никогда не знал (бесполезной) спецификации UTF-8 !.
dotancohen
@dotancohen: я тестирую в своей Fedora, и tailрешение работает отлично. Какую ОС вы используете?
Cuonglm
Это не работает (т.е. удаляет спецификацию) для версии "iconv (GNU libiconv 1.14)" в Git Bash в Windows. Но (по какой-то причине) использование только UTF-16вместо одной из версий порядка следования байтов работает.
Кенни Эвитт
3

dos2unix также удаляет спецификации и преобразует 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 также удаляет спецификации UTF-8:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61
nisetama
источник
0

Также ответил на StackOverflow: Как я могу удалить спецификацию из файла UTF-8? У @rici хороший ответ.

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

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