Обробити файл, який починається з BOM (FF FE)


10

Я отримав файл .csv з FF FEBOM:

$ 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), щоб нормальні інструменти працювали з ним?


CSV-файл, створений у Windows чи Mac?
cuonglm

Ви можете дати частину файлу?
cuonglm

Ось посилання на анонімізовану частину файлу, яка зберігає унікальні проблеми з ним. Дякую!
dotancohen

Відповіді:


16

З цієї статті у Вікіпедії , FF FEозначає UTF16LE. Тож вам слід сказати iconvперетворитись UTF16LEна UTF8:

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

Ідеально, дякую! У мене були змішані UTF-8 і UTF-16 BOM: я думав, що FFFE і FEFF - це UTF-8, і я ніколи не знав, що UTF-16 BOM (s). Насправді це UTF-16 BOM, і я ніколи не знав (марну) UTF-8 BOM !.
dotancohen

@dotancohen: Я перевіряю свою Fedora, і tailрішення працює нормально. Яку ОС ви використовуєте?
cuonglm

Це не працює (тобто видаліть BOM) для версії "iconv (GNU libiconv 1.14)" в Git Bash для Windows. Але (з якої причини) працює просто UTF-16замість однієї з версій байт-порядку.
Кенні Евітт

3

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 також видаляє UTF-8 BOM:

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

0

Також відповів на StackOverflow: Як я можу видалити BOM з файлу 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 люблять додавати ці позначки. Більшість редакторів не видалить ці позначки.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.