При конвертации вашего файла вы должны быть уверены, что он содержит метку порядка байтов. Несмотря на то, что в стандарте говорится, что метка порядка байтов не рекомендуется для UTF-8 , между UTF-8 и ASCII могут быть законные путаницы без метки порядка байтов .
Кроме того, указание UTF-16BEили UTF-16LE не предшествует метка порядка байтов , поэтому я сначала преобразовать в UTF-16, который использует зависящий от платформы порядковый номер. Затем я использую fileдля определения фактического порядка байтов и преобразования из этого в UTF-16LE.
Наконец, при создании файла с помощью bashфайл получает bash«s locale charmapкодировку, так это то, что вам нужно сопоставить с.
(Я пишу все мои кодировки в верхнем регистре, потому что, когда вы перечисляете все iconvподдерживаемые кодировки iconv -l, все они в верхнем регистре.)
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