Начал с энтузиазмом заниматься 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.
Кое как всё же я нашёл лунку в которую нырнуть.
Получилось разрешить эту проблему, сопоставив сведения из двух типов источников. Один относился к теме перекодировки шрифтов в 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.
Комментариев нет :
Отправить комментарий