Баг в Template Toolkit-е с UTF-8

8 мая, 11:14 / Template Toolkit, баг, UTF-8, Perl

Вчера наткнулся на очень неприятную ошибку в 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 исправил этот баг.

Комментарии

Комментирование временно отключено.

Димка 8 мая, 23:30
Вот, если бы в тебя всякие ютыэфные символы пихали, вот ты бы хорошо работал? :)
Максим Вуец 9 мая, 00:57
Димка, пихают ведь, пихают!
arta 12 июня, 23:13
Промучался весь день, пока не нашел твой пост. Большое спасибо, очень помогло!