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