Processe um arquivo que comece com um BOM (FF FE)

8

Recebi um arquivo .csv com o 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.|

Ao usar awk para analisá-lo, estou obtendo vários bytes nulos, que suspeito serem devidos à ordem de bytes. Como posso trocar a ordem de bytes neste arquivo (usando a CLI) para que as ferramentas normais funcionem com ele?

Note que eu acho que este arquivo é apenas caracteres ASCII (exceto para o BOM), mas não posso confirmar isso porque grep acha que é um arquivo binário:

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

A pesquisa pela mesma sequência no VIM mostra todos os caracteres correspondentes!

Usar iconv para converter para ASCII não elimina os valores de \ x00, mas na verdade piora o problema, já que agora parecem bytes nulos em vez de 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.|

Como posso trocar a ordem de bytes neste arquivo (usando a CLI) para que as ferramentas normais funcionem com ele?

    
por dotancohen 15.06.2014 / 10:07

2 respostas

12

Neste artigo da Wikipédia , FF FE significa UTF16LE . Portanto, você deve informar iconv para converter de UTF16LE para UTF8 :

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
    
por 15.06.2014 / 10:52
3

dos2unix também remove as BOMs e converte UTF-16 em 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 também remove as BOMs UTF-8:

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