Perl и UTF-8

Оставим в стороне теорию, о ней достаточно написано из без меня, например, здесь Пара слов про UTF-8 и здесь UTF Perl Practice, или как использовать UTF-8 в перле. После прочтения теории я занялся практикой и сделал для себя следующие практические заготовки.

Включаем флаг UTF-8 для всех строк в программе:

use utf8;

Выставляем флажок UTF-8 для всех строк, прочитанных или записанных в текстовые файлы, включая стандартные потоки ввода-вывода:

use open qw(:std :utf8);

Странным образом предыдущие настройки включают блочную буферизацию стандартных потоков вывода. Отключаем её:

select(STDERR);
$| = 1;
select(STDOUT);
$| = 1;

Выставляем флажок UTF-8 для всех строк, полученных в переменных CGI:

use CGI qw(:cgi -utf8);

Выставляем флажок UTF-8 для файла, с помощью которого грузится шаблон HTML::Template и все подшаблоны. К сожалению, не нашёл в документации модуля способа однократно задать использование этой настройки глобально.

my $template = HTML::Template->new(filename => "/var/www/index.tmpl",
                                   utf8 => 1,
                                   die_on_bad_params => 0,
                                   global_vars => 1);

Чтобы модуль DBI выставлял флаг UTF-8 для всех строк, прочитанных из БД MySQL или переданных ей, выставляем настройку в дескрипторе соединения.

$dbh->{mysql_enable_utf8} = 1;

Аналогично для PostgreSQL:

$dbh->{pg_enable_utf8} = 1;

Нужно отметить, что эти настройки для DBI не указывает кодировку клиента, а только лишь дают инструкцию модулю выставлять флажок UTF-8 у строк.

На этом, вроде, всё.

Написать автору