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