Saya menerima file .csv dengan FF FE
BOM:
$ 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 awk
untuk 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 grep
bahwa 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 iconv
untuk 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?
sumber
Jawaban:
Dari artikel wikipedia ini ,
FF FE
berartiUTF16LE
. Jadi, Anda harus memberi tahuiconv
untuk mengonversi dariUTF16LE
keUTF8
:sumber
tail
solusinya berfungsi dengan baik. OS apa yang Anda gunakan?UTF-16
alih-alih salah satu versi byte-order berfungsi.dos2unix
juga menghapus BOM dan mengkonversi UTF-16 ke UTF-8:dos2unix
juga menghapus BOM UTF-8:sumber
Juga dijawab di StackOverflow: Bagaimana saya bisa menghapus BOM dari file UTF-8? @rici punya jawaban yang bagus.
Jawaban singkat:
sed -i $'1s/^\uFEFF//' file.txt
tetapi tidak pada BSD atau OS / X.vi file.txt
,:set nobomb
,:w
, sederhana namun panduandos2unix -r file.txt
sumber