Memproses file yang dimulai dengan BOM (FF FE)

10

Saya menerima file .csv dengan 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.|

Saat menggunakan awkuntuk mem-parsingnya, saya mendapatkan banyak byte nol, yang saya duga disebabkan oleh urutan byte. Bagaimana saya bisa menukar urutan byte pada file ini (menggunakan CLI) sehingga alat normal akan bekerja dengannya?

Perhatikan bahwa saya berpikir bahwa file ini hanya karakter ASCII (kecuali untuk BOM), tetapi saya tidak dapat mengonfirmasi grepbahwa itu adalah file biner:

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

Mencari string yang sama di VIM menunjukkan setiap karakter yang cocok!

Menggunakan iconvuntuk mengkonversi ke ASCII tidak menghilangkan nilai \ x00, sebenarnya itu membuat masalah lebih buruk karena sekarang mereka terlihat seperti byte nol, bukan 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.|

Bagaimana saya bisa menukar urutan byte pada file ini (menggunakan CLI) sehingga alat normal akan bekerja dengannya?

dotancohen
sumber
File CSV yang Anda buat di Windows atau Mac?
cuonglm
Bisakah Anda memberikan sebagian file?
cuonglm
Berikut ini tautan ke bagian file yang dianonimkan yang mempertahankan masalah unik dengannya. Terima kasih!
dotancohen

Jawaban:

15

Dari artikel wikipedia ini , FF FEberarti UTF16LE. Jadi, Anda harus memberi tahu iconvuntuk mengonversi dari UTF16LEke UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
cuonglm
sumber
Sempurna, terima kasih! Saya memiliki UTF-8 dan UTF-16 BOM yang tercampur: Saya pikir FFFE dan FEFF adalah UTF-8 dan saya tidak pernah tahu UTF-16 BOM (s). Sebenarnya, itu adalah BOM UTF-16, dan saya tidak pernah tahu BOM UTF-8 yang tidak berguna !.
dotancohen
@dotancohen: Saya menguji di Fedora saya dan tailsolusinya berfungsi dengan baik. OS apa yang Anda gunakan?
cuonglm
Ini tidak bekerja (yaitu menghapus BOM) untuk versi "iconv (GNU libiconv 1.14)" di Git Bash pada Windows. Tetapi (untuk alasan apa pun) menggunakan hanya UTF-16alih-alih salah satu versi byte-order berfungsi.
Kenny Evitt
3

dos2unix juga menghapus BOM dan mengkonversi UTF-16 ke 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 juga menghapus BOM UTF-8:

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

Juga dijawab di StackOverflow: Bagaimana saya bisa menghapus BOM dari file UTF-8? @rici punya jawaban yang bagus.

Jawaban singkat:

  • Jawaban singkat:, sed -i $'1s/^\uFEFF//' file.txttetapi tidak pada BSD atau OS / X.
  • Jawaban lain: vi file.txt, :set nobomb, :w, sederhana namun panduan
  • Instal dos2unuix; dos2unix -r file.txt
  • Tanda-tanda ini memiliki beberapa kemungkinan arti, termasuk hanya bahwa file tersebut adalah UTF-8; lihat Artikel Wikipedia .
  • Program Windows suka menambahkan tanda-tanda ini. Kebanyakan editor tidak akan menghapus tanda ini.
Charles Merriam
sumber