Ao converter seu arquivo, verifique se ele contém uma marca de ordem de bytes. Embora o padrão diga que uma marca de ordem de bytes não é recomendada para UTF-8 , pode haver confusões legítimas entre UTF-8 e ASCII sem uma marca de ordem de bytes .
Além disso, especificando UTF-16BE
ou UTF-16LE
não acrescentando uma marca de ordem de byte , primeiro eu me converto em UTF-16
, que usa um endianness dependente da plataforma. Então, eu uso file
para determinar a endianness real e a conversão disso para UTF-16LE
.
Finalmente, quando você cria um arquivo usando bash
, o arquivo recebe bash
a locale charmap
codificação, e é disso que você precisa mapear.
(Eu coloco todas as minhas codificações em maiúsculas, porque quando você lista todas iconv
as codificações suportadas com iconv -l
todas elas estão em 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