"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%