Изменить кодировку TXT-файла
Когда я пишу:
file file1.txt
У меня есть этот вывод: Little-endian UTF-16 текст Unicode, с символами конца строки CR
Тогда если я напишу:
file file2.txt
У меня есть: текст ASCII
file2.txt создается путем:
echo $var > "file2.txt"
Я хотел бы, чтобы file2.txt имел ту же кодировку, что и file1.txt. Как я могу это сделать?
3 ответа
Ты можешь использовать iconv
преобразовать кодировку файла:
iconv -f ascii -t utf16 file2.txt > another.txt
another.txt
должен иметь желаемую кодировку.
Вы также можете попробовать это:
echo $var | iconv -f ascii -t utf16 > "file2.txt"
Используйте iconv:
echo "$var" | iconv --from-code=utf-8 --to-code=utf-16le --output=file2.txt
При конвертации вашего файла вы должны быть уверены, что он содержит метку порядка байтов. Хотя в стандарте говорится, что метка порядка следования байтов не рекомендуется для 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