Баг в Template Toolkit-е с UTF-8
Вчера наткнулся на очень неприятную ошибку в Template Toolkit-е. Он не находит в хеше ключи, которые представляют из себя строки в UTF-8.
Еще одной проблемой является то, что виртуальный метод
length
возвращает количество байт, а не символов
(см. #43323,
#45017).
Как выяснилось, проблема кроется
в Template::Stash::XS —
XS-версии хранилища данных шаблона. Если вместо этого модуля воспользоваться
чисто Perl-овым
Template::Stash,
то проблема исчезает.
Вывод. Template::Stash::XS не умеет корректно работать с UTF-8.
Воспроизводится на последних версиях:
2.20
и 2.20_1.
Создана заявка #45842.
Обход проблемы. Необходимо явно указать какой stash вы хотите использовать:
$Template::Config::STASH = 'Template::Stash';
Демонстрация.
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Template;
binmode STDOUT, ':utf8';
# XXX: uncomment this to make Template work properly
#$Template::Config::STASH = 'Template::Stash';
Template->new()->process(\*DATA, {
ascii => 'key',
utf8 => 'ключ',
hash => {
key => 'value',
ключ => 'значение'
},
str => 'щука'
});
__DATA__
ascii = [% ascii %]
hash.$ascii = [% hash.$ascii %]
utf8 = [% utf8 %]
hash.$utf8 = [% hash.$utf8 %]
str.length = [% str.length %]
С XS-версией stash-а:
ascii = key hash.$ascii = value utf8 = ключ hash.$utf8 = str.length = 8
С Perl-версией shash-а:
ascii = key hash.$ascii = value utf8 = ключ hash.$utf8 = значение str.length = 4
Добавлено 4 июля 2009 года: сегодня Andy исправил этот баг.