Ao converter seu arquivo, você deve ter certeza de que ele contém uma marca de ordem de byte. Embora a norma indique que um byte-order-mark não é recomendado para UTF-8 , pode haver confusões legítimas entre UTF-8 e ASCII sem uma marca de ordem de byte .
Além disso, a especificação de UTF-16BE
ou UTF-16LE
não prefixa uma marca de ordem de byte , portanto, primeiro converter para UTF-16
, que usa um endianness dependente de plataforma. Então, eu uso file
para determinar o endianness atual e o convertido daquele para UTF-16LE
.
Por fim, quando você cria um arquivo usando bash
, o arquivo recebe a codificação bash
de locale charmap
, e é isso que você precisa mapear.
(em maiúsculas todas as minhas codificações porque quando você lista todas as codificações suportadas de iconv
com iconv -l
elas são todas maiúsculas.)
BASH_ENCODING="$( locale charmap | tr [:lower:] [:upper:] )"
echo $var | iconv -f "$BASH_ENCODING" -t UTF-16 > UTF-16-UNKNOWN-ENDIANNESS-FILE
FILE_ENCODING="$( file --brief --mime-encoding UTF-16-UNKNOWN-ENDIANNESS-FILE )"
iconv -f "$FILE_ENCODING" -t UTF-16LE UTF-16-UNKNOWN-ENDIANNESS-FILE > file2.txt