Processar um arquivo que começa com uma BOM (FF FE)

10

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

Ao usá awk-lo para analisá-lo, estou recebendo um monte de bytes nulos, que suspeito que sejam devidos à ordem dos bytes. Como posso trocar a ordem dos bytes neste arquivo (usando a CLI) para que as ferramentas normais funcionem com ele?

Observe que acho que esse arquivo é apenas caracteres ASCII (exceto a BOM), mas não posso confirmar isso como greppensa que é um arquivo binário:

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

Procurar a mesma sequência no VIM mostra todos os caracteres correspondentes!

Usar iconvpara converter para ASCII não elimina os valores \ x00; na verdade, piora o problema, pois agora eles 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 dos bytes neste arquivo (usando a CLI) para que as ferramentas normais funcionem com ele?

dotancohen
fonte
O arquivo CSV que você criou no Windows ou Mac?
cuonglm
Você pode dar uma parte do arquivo?
cuonglm
Aqui está um link para uma parte anônima do arquivo que preserva os problemas exclusivos dele. Obrigado!
dotancohen

Respostas:

15

A partir deste artigo da wikipedia , FF FEsignifica UTF16LE. Portanto, você deve dizer iconvpara converter de UTF16LEpara UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
cuonglm
fonte
Perfeito, obrigado! Eu tinha o BOM UTF-8 e UTF-16 misturado: pensei que FFFE e FEFF fossem UTF-8 e nunca conheci o (s) BOM UTF-16. Na verdade, essas são BOMs UTF-16 e eu nunca conheci a (inútil) BOM UTF-8 !.
dotancohen
@dotancohen: eu testo no meu Fedora e a tailsolução funciona bem. Qual SO você usa?
cuonglm
Isso não funciona (por exemplo, remova a BOM) da versão "iconv (GNU libiconv 1.14)" no Git Bash no Windows. Mas (por qualquer motivo), usar apenas ao UTF-16invés de uma das versões da ordem de bytes funciona.
precisa saber é o seguinte
3

dos2unix também remove 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 BOMs UTF-8:

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

Também respondido no StackOverflow: Como remover a BOM de um arquivo UTF-8? @rici tem uma boa resposta.

Resposta curta:

  • Resposta curta:, sed -i $'1s/^\uFEFF//' file.txtmas não no BSD ou no OS / X.
  • Outra resposta: vi file.txt, :set nobomb,:w , simples, mas o manual
  • Instale o dos2unuix; dos2unix -r file.txt
  • Essas marcas têm vários significados possíveis, incluindo apenas que o arquivo é UTF-8; veja o artigo da Wikipedia .
  • Os programas do Windows adoram adicionar essas marcas. A maioria dos editores não remove essas marcas.
Charles Merriam
fonte