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?


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

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

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.