Por que não consigo converter um UTF-8 para MS-ANSI usando iconv?

2

Estou tentando converter um arquivo de utf-8 para ms-ansi.

eu uso

  iconv -f UTF8 -t MS-ANSI// < data.txt

mas obtenha

  iconv: illegal input sequence at position 171359

quando se olha para isto

 dd if=data.txt of=error.txt bs=1 count=10 skip=171359

Eu entendo isso:

 hexdump -C error.txt
 00000000  ef bb bf 38 3a 6e 61 09  38 3a                    |...8:na.8:|
 0000000a

é o arquivo não utf-8, e se não, o que devo usar em vez de iconv?

    
por iconvertor 27.09.2016 / 13:13

1 resposta

1

$ printf '\xef\xbb\xbf' | uconv -x any-name
\N{ZERO WIDTH NO-BREAK SPACE}

Esse é um caractere (U + FEFF, codificado em 3 bytes em UTF-8), que também é usado como marca de ordem de byte. Em qualquer caso, esse caractere não é encontrado em MS-ANSI (um nome impróprio às vezes dado ao windows-1252, um superconjunto de iso8859-1), portanto, não pode ser convertido para isso.

BOM são usados (no início de algum texto) para diferenciar o UTF16-LE do UTF16-BE (ou outras codificações não-byte afetadas pelo endianness do CPU). Não faz sentido em UTF-8, onde não há ambiguidade de ordem de byte, faria ainda menos sentido no Windows-1252, que é um charset de caractere de byte único. Como um "espaço sem quebra de largura zero", ele também é invisível e não possui propriedade de separação de palavras como o caractere "espaço com largura zero", portanto, é seguro removê-lo completamente.

Com zsh , bash ou ksh93 :

sed $'s/\ufeff//g' < input | iconv -t windows-1252

Com algumas implementações de iconv , você também pode usar:

iconv -t windows-1252//translit < input

//translit recorre a aproximações quando o texto não pode ser traduzido fielmente. Nesse caso, apenas remove o caractere U + FEFF.

$ printf '\xef\xbb\xbf\x38\x3a\x6e\x61\x09\x38\x3a' |
    iconv -t windows-1252//translit | hd
00000000  38 3a 6e 61 09 38 3a                              |8:na.8:|
00000007
    
por 27.09.2016 / 13:31