Converte a codificação binária que a cabeça e o bloco de notas podem ler para UTF-8

4

Eu tenho um arquivo CSV que está no conjunto de caracteres binários, mas preciso converter em UTF-8 para processar em HDFS (Hadoop).

Eu usei o comando abaixo para verificar o conjunto de caracteres.

file -bi filename.csv

Saída:

application/octet-stream; charset=binary

quando eu tento converter o arquivo de binário para UTF-8, ele gera um erro.

iconv -f binary -t utf-8 fiename.csv
iconv: conversion from binary' is not supported
Try iconv --help' or iconv --usage' for more information.

alguém pode me ajudar a entender se é possível converter ou não, eu posso ver os dados usando o comando head.

O que significa, Binário significa não legível, mas como o comando principal ou bloco de notas pode ler os dados.

od -tc < filename.csv | cabeça

0000000 357 273 277   |   |   R   e   q   u   e   s   t   _   I   D   #
0000020   D   #   T   y   p   e   #   D   #   S   u   b   m   i   t   t
0000040   e   r   #   D   #   S   h   o   r   t   _   D   e   s   c   r
0000060   i   p   t   i   o   n   #   D   #   L   o   g   _   T   e   x
0000100   t   #   D   #   S   t   a   t   u   s   #   D   #   A   s   s
0000120   i   g   n   e   d   _   T   o   #   D   #   A   s   s   i   g
0000140   n   e   e   #   D   #   C   r   e   a   t   e   _   D   a   t
0000160   e   #   D   #   F   o   r   w   T   o   E   x   t   H   D   #
0000200   D   #   L   a   s   t   _   M   o   d   i   f   i   e   d   _
0000220   B   y   #   D   #   L   o   g   _   I   D   #   D   #   L   o
    
por William R 18.08.2016 / 10:35

2 respostas

11

"binary" não é uma codificação (nome do conjunto de caracteres). O iconv precisa de um nome de codificação para fazer seu trabalho.

O utilitário file não fornece informações úteis quando não reconhece o formato do arquivo. Pode ser UTF-16 , por exemplo, sem uma marca de codificação por byte (BOM). notepad lê isso. O mesmo se aplica a UTF-8 (e head exibiria que já que seu terminal pode estar configurado para codificação UTF-8 e não se importaria com uma BOM).

Se o arquivo for UTF-16, seu terminal exibirá isso usando head porque a maioria dos caracteres seria ASCII (ou até Latin-1), tornando o byte "outro" dos caracteres UTF-16 um valor nulo .

Em ambos os casos, a falta de BOM irá (dependendo da versão de file ) confundi-lo. Mas outros programas podem funcionar, porque esses formatos de arquivo podem ser usados com o Microsoft Windows, bem como com aplicativos portáteis que podem ser executados no Windows.

Para converter o arquivo em UTF-8, você precisa saber qual codificação ele usa e qual o nome dessa codificação com iconv . Se já for UTF-8, se você adicionar uma BOM (no início) é opcional. UTF-16 tem dois sabores, de acordo com qual byte é o primeiro. Ou você poderia mesmo ter UTF-32. iconv -l lista estes:

ISO-10646/UTF-8/
ISO-10646/UTF8/
UTF-7//
UTF-8//
UTF-16//
UTF-16BE//
UTF-16LE//
UTF-32//
UTF-32BE//
UTF-32LE//
UTF7//
UTF8//
UTF16//
UTF16BE//
UTF16LE//
UTF32//
UTF32BE//
UTF32LE//

"LE" e "BE" se referem a final pouco e final para o byte-order. O Windows usa os sabores "LE" e iconv provavelmente pressupõe que para os sabores que não possuem "LE" ou "BE".

Você pode ver isso usando um dump octal (sic):

$ od -bc big-end
0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040
         
iconv -f UTF-16LE// -t UTF-8// <input >output
T
ISO-10646/UTF-8/
ISO-10646/UTF8/
UTF-7//
UTF-8//
UTF-16//
UTF-16BE//
UTF-16LE//
UTF-32//
UTF-32BE//
UTF-32LE//
UTF7//
UTF8//
UTF16//
UTF16BE//
UTF16LE//
UTF32//
UTF32BE//
UTF32LE//
h
$ od -bc big-end
0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040
         
iconv -f UTF-16LE// -t UTF-8// <input >output
T %pre% h %pre% u %pre% %pre% A %pre% u %pre% g %pre% 0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 %pre% 1 %pre% 8 %pre% %pre% 0 %pre% 5 %pre% : %pre% 0 %pre% 1 0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 %pre% : %pre% 5 %pre% 7 %pre% %pre% E %pre% D %pre% T %pre% 0000060 000 062 000 060 000 061 000 066 000 012 %pre% 2 %pre% 0 %pre% 1 %pre% 6 %pre% \n 0000072 $ od -bc little-end 0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000 T %pre% h %pre% u %pre% %pre% A %pre% u %pre% g %pre% %pre% 0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000 1 %pre% 8 %pre% %pre% 0 %pre% 5 %pre% : %pre% 0 %pre% 1 %pre% 0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000 : %pre% 5 %pre% 7 %pre% %pre% E %pre% D %pre% T %pre% %pre% 0000060 062 000 060 000 061 000 066 000 012 000 2 %pre% 0 %pre% 1 %pre% 6 %pre% \n %pre% 0000072
u %pre% %pre% A %pre% u %pre% g %pre% 0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 %pre% 1 %pre% 8 %pre% %pre% 0 %pre% 5 %pre% : %pre% 0 %pre% 1 0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 %pre% : %pre% 5 %pre% 7 %pre% %pre% E %pre% D %pre% T %pre% 0000060 000 062 000 060 000 061 000 066 000 012 %pre% 2 %pre% 0 %pre% 1 %pre% 6 %pre% \n 0000072 $ od -bc little-end 0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000 T %pre% h %pre% u %pre% %pre% A %pre% u %pre% g %pre% %pre% 0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000 1 %pre% 8 %pre% %pre% 0 %pre% 5 %pre% : %pre% 0 %pre% 1 %pre% 0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000 : %pre% 5 %pre% 7 %pre% %pre% E %pre% D %pre% T %pre% %pre% 0000060 062 000 060 000 061 000 066 000 012 000 2 %pre% 0 %pre% 1 %pre% 6 %pre% \n %pre% 0000072

Assumindo UTF-16LE, você pode converter usando

%pre%     
por 18.08.2016 / 10:43
0

O link pode ser usado para determinar a codificação do seu texto, então você pode convertê-lo para o que precisa.

    
por 18.08.2016 / 17:05