$ 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