Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Конвертирование файлов в кодировку UTF-8 в Linux

Оригинал: How to Convert Files to UTF-8 Encoding in Linux
Автор: Aaron Kili
Дата публикации: 2 ноября 2016 года
Перевод: А. Кривошей
Дата перевода: ноябрь 2017 г.

В этом руководстве мы рассмотрим кодировки символов и разберем несколько примеров преобразования файлов из одной кодировки в другую с помощью утилиты командной строки. Затем мы покажем, как преобразовать файлы в Linux из любой кодировки (charset) в UTF-8.

Как вы, наверное, уже знаете, компьютер не понимает и не хранит информацию в виде букв, цифр или чего-либо еще. Он работает только с битами. Бит имеет только два возможных значения - 0 или 1, true или false, да или нет. Все остальное кодируется последовательностями битов.

Простыми словами, кодировка символов - это способ кодировки различных символов определенными последовательностями нулей и единиц. Когда мы вводим текст и сохраняем его в файл, слова и предложения, которые мы набираем, состоят из разных символов, а символы преобразуются в биты с помощью кодировки.

Существуют различные схемы кодирования, такие как ASCII, ANSI, Unicode и другие. Ниже приведен пример кодировки ASCII.

Character  bits
A               01000001
B               01000010

В Linux для преобразования текста из одной кодировки в другую используется утилита командной строки iconv.
Вы можете проверить кодировку файла с помощью команды file, используя флаг -i или -mime, который печатает строку типа mime, как в приведенных ниже примерах:

$ file -i Car.java
$ file -i CarDriver.java

проверка кодировки

Синтаксис команды iconv следующий:

$ iconv option
$ iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile

Где -f или --from-code задает входную кодировку, а -t или --to-encoding задает конечную кодировку.

Для того, чтобы вывести список всех доступных опций, введите:

$ iconv -l 

список всех доступных опций iconv

Конвертирование файлов из UTF-8 в ASCII

Далее мы научимся конвертировать текст из одной кодировки в другую. Приведенная ниже команда преобразует текст из ISO-8859-1 в кодировку UTF-8.

Рассмотрим файл input.file, который содержит следующие символы:

� � � � 

(Прим: вы увидите эти символы на снимке ниже)

Начнем с проверки кодировки файла, затем просмотрим его содержимое. Мы можем преобразовать все символы в кодировку ASCII.
После запуска команды iconv мы затем проверяем содержимое выходного файла и новую кодировку, как показано ниже.

$ file -i input.file
$ cat input.file 
$ iconv -f ISO-8859-1 -t UTF-8//TRANSLIT input.file -o out.file
$ cat out.file 
$ file -i out.file 

содержимое выходного файла

Примечание. Если в команду добавлена строка //IGNORE, то символы, которые не могут быть преобразованы, и ошибка выводятся после преобразования.

Далее, если добавлена строка //TRANSLIT, как в приведенном выше примере (ASCII//TRANSLIT), преобразуемые символы при необходимости и по возможности транслитерируются. Это означает, что если символ не может быть представлен в целевой кодировке, его можно аппроксимировать одним или несколькими похожими символами.

Далее, любой символ, который не может быть транслитерирован и которого нет в целевой кодировке, заменяется в выводе вопросительным знаком (?).

Конвертирование нескольких файлов в кодировку UTF-8

Возвращаясь к основной теме нашей статьи, мы можем написать небольшой скрипт для преобразования нескольких или всех файлов в каталоге в кодировку UTF-8, под названием encoding.sh:

#!/bin/bash
#здесь задаем входную кодировку
FROM_ENCODING="value_here"
#конечная кодировка (UTF-8)
TO_ENCODING="UTF-8"
#преобразование
CONVERT=" iconv  -f   $FROM_ENCODING  -t   $TO_ENCODING"
#цикл для преобразования нескольких файлов
for  file  in  *.txt; do
$CONVERT   "$file"   -o  "${file%.txt}.utf8.converted"
done
exit 0

Сохраните этот файл и сделайте скрипт исполняемым. Запускайте его из той директории, где расположены ваши файлы.

$ chmod  +x  encoding.sh
$ ./encoding.sh

Важное замечание. Вы также можете также использовать этот скрипт для преобразования нескольких файлов из одной заданной кодировки в другую (любую), просто меняйте со значения переменных FROM_ENCODING и TO_ENCODING, не забывая об имени выходного файла «$ {file% .txt}. utf8.converted».

Для получения дополнительной информации почитайте руководство iconv:

$ man iconv

Подводя итог этой статье, необходимо отметить, что понимание способов преобразования текста из одной кодировки в другую - это знания, необходимые каждому пользователю компьютера, а тем более программистам, когда дело касается работы с текстами.

Если вы хотите лучше понять проблему кодировок символов, прочитайте следующие статьи: