Пропаганда

понедельник, 27 апреля 2015 г.

Perl. Правильное отображение кириллицы (русского шрифта) в командной строке и при чтении из файла

     Начал с энтузиазмом заниматься Perl'ом и сразу же стал биться как рыба об лёд с не читабельным отображением текстовых данных (строк) в консоле (командной строке).
Кое как всё же я нашёл лунку в которую нырнуть.


Получилось разрешить эту проблему, сопоставив сведения из двух типов источников. Один относился к теме перекодировки шрифтов в Perl'е (ссылка на источник), другой, к смене кодировки в консоле (ссылка на источник). Из первого узнаём как перекодировать в Перле и как открыть файл в определённой кодировке, из второго, в какую кодировку использовать при выводе текстовых данных в консоле.



   Итак, чтобы текст на экране консоли был читабельным можно в настройках программы в которой пишется программный код Перл установить DOS кодировку (числовой код 866). Тогда весь текст кода будет в той же кодировки, что используется в консоли. Однако это приведёт к к проблемам с использованием русских букв в названии файлов, а также при записи русского текста во внешние файлы.
    Поэтому более удобно использовать две функции decode и encode из модуля Encode. Обе функции имеют два параметра: decode("кодировка", "текст"), encode("кодировка", "текст"). Первая переводит текст из произвольной кодировки в некий внутренний формат перла, а вторая из внутреннего в любой другой. При этом перевести кодировку напрямую из произвольного формата в любой другой не получится.

Вот как это может выглядеть:

use Encode qw(decode encode);
my $text = 'Русские буквы в системной кодировке windows 1251';
      $text = decode("cp1251", $text);
      $text = encode("cp866", $text);
print $text;

Для функции decode указывается параметр "cp1251" кодировки в которой написан текст. Если это unicode, то указывается "utf8" (или 4, 16, 32, 64). Для функции encode указывается кодировка "cp866" в которую будет перекодирован текст для вывода в консоли.

Можно использовать более короткую запись:

use Encode qw(decode encode);
my $text = 'Русские буквы в кодировке unicode UTF8';
print encode("cp866", decode("utf8"$text));

Теперь пример как делается чтение из файла с произвольной кодировкой.

open(my $fh, '<:encoding(cp1251)', "data.txt");

Т.е. просто указывается параметр encoding(cp1251), где cp1251 кодировка текста в файле. При этом текст кодируется в некой внутренней перловской кодировке.
Данную операцию нужно проделывать обязательно для того, чтобы потом иметь возможность перекодировать текст в любую другую кодировку. При этом, чтобы в дальнейшем корректно отобразить в консоле текст полученный таким образом из файла, нужно использовать уже только функцию encode.

Комментариев нет :

Отправить комментарий