perl, v5.10.1 built for MSWin32-x86-multi-thread (acivestate)
template::toolkit 2.22
В скриптах везде указано use utf8, во всех скриптах и во всех темплейтах есть BOM-заголовок, все сохранены в utf.
Инициализация так сделана:
$tt = Template->new({
INCLUDE_PATH => $$cfg{tpl_path},
ENCODING => 'utf8',
}) || die "$tt::ERROR\n";
Проблема:
если в шаблоне есть не-ascii символ, к примеру, любая русская буква — тогда на выходе получается каша вида "ÐлÑпÑй вопÑоÑ" (при этом русские буквы, которые в шаблоне присутствовали, читаются).
Если в шаблоне только ascii, тогда всё работает нормально, включая русские строки, которые изымаются из базы и вставляются в шаблоны.
То есть, TT не хочет нормально работать с шаблонами, в которых изначально есть русские буквы. При этом строит страницы по этим шаблонам без проблем, даже если в значениях переменных оказываются русские буквы.
Ставил в вызовах process() опцию binmode => ':utf8', не помогает.
По-умолчанию стоит «0», поэтому, я подозреваю, TT конвертил данные от sql в utf самостоятельно, но как-то не в том месте, в результате какие-то данные оказывались дважды преобразованными в utf.
use utf8;
use open OUT => ':utf8';
use DBI;
my $dbh = DBI->connect(«DBI:mysql:database=mybase;host=localhost;port=3306», «login», «pass»);
#$dbh->do('SET CHARACTER SET utf8');
open TST, '>utftest1.txt';
binmode TST;
print TST «русский»;
Файл utftest1.txt содержит 14 байт, и если его смотреть любым текстовым редактором, видно слово «русский».
Файл utftest2.txt содержит 28 байт непонятно чего (двойная перекодировка?):
Но при этом то, что выдаёт DBI, обрабатывается при помощи TT правильно в моих скриптах! А проблемы начинаются, если в скрипт или шаблон вставлять русские символы.