При конвертации вашего файла вы должны быть уверены, что он содержит метку порядка байтов. Несмотря на то, что в стандарте говорится, что метка порядка байтов не рекомендуется для 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