Al convertir su archivo, debe asegurarse de que contenga una marca de orden de bytes. Aunque el estándar dice que no se recomienda una marca de orden de bytes para UTF-8 , puede haber confusiones legítimas entre UTF-8 y ASCII sin una marca de orden de bytes .
Además, especificando UTF-16BEo UTF-16LE no antepone una marca de orden de bytes , por lo que primero convierto a UTF-16, que usa una endianness dependiente de la plataforma. Luego, uso filepara determinar la endianness real y la conversión de eso a UTF-16LE.
Finalmente, cuando crea un archivo usando bash, el archivo recibe bashla locale charmapcodificación, por lo que es lo que necesita para mapear.
(Pongo en mayúscula todas mis codificaciones porque cuando enumeras todas iconvlas codificaciones admitidas iconv -l, todas son mayú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