15

Когда я пишу:

file file1.txt 

У меня есть такой вывод: Little-endian UTF-16 Unicode текст, с ограничителями строки CR

Тогда если я напишу:

file file2.txt 

У меня есть: текст ASCII

file2.txt создается путем:

echo $var > "file2.txt"

Я хотел бы, чтобы file2.txt имел ту же кодировку, что и file1.txt. Как я могу это сделать ?

3 ответа3

23

Вы можете использовать iconv для преобразования кодировки файла:

iconv -f ascii -t utf16 file2.txt > another.txt

another.txt должен иметь желаемую кодировку.

Вы также можете попробовать это:

echo $var | iconv -f ascii -t utf16 > "file2.txt"
7

Используйте iconv:

echo "$var" | iconv --from-code=utf-8 --to-code=utf-16le --output=file2.txt
1

При конвертации вашего файла вы должны быть уверены, что он содержит метку порядка байтов. Несмотря на то, что в стандарте говорится, что метка порядка байтов не рекомендуется для UTF-8, между UTF-8 и ASCII могут быть законные путаницы без метки порядка байтов.

Кроме того, указание UTF-16BE или UTF-16LE не предшествует метке порядка байтов, поэтому я сначала преобразую в UTF-16 , в котором используется зависящий от платформы порядковый номер. Затем я использую file для определения фактического порядка байтов и преобразования из него в UTF-16LE .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .