Набор шаблонов символов - PullRequest
       11

Набор шаблонов символов

6 голосов
/ 20 декабря 2010

кажется, что набор инструментов шаблона не обрабатывает кодировку должным образом.

Я передаю template->process имя файла (где получить шаблон), ссылку на хеш (содержащий все параметры) и скалярссылка (куда поместить вывод), затем я возвращаю это и, в свою очередь, отображаю его пользователю.

Когда я даю ему строку с умлаутом, вывод html включает в себя черный ромб с белым вопросомОтметьте вместо каждой буквы (но правильное количество букв).Любой другой символ получается нормально.

Я использую предупреждение, чтобы распечатать строку, прежде чем я сделаю вызов template-> process, и на данный момент все нормально, насколько я могу судить, это во времяtemplate->process назовите, что все превращается в мусор.

Есть идеи?Я пытался использовать ENCODING => "utf8" так же, как и binmode => ":utf8", но ни один из них не влияет на вывод.

Вот мой код с некоторыми обрезанными жирными краями, чтобы показать мой вызов template-> process,обратите внимание, что если я пропущу {binmode => 'utf8'}, это не даст никакого эффекта.

<put variables in hash referenced to by vars>
<print out variables in has referenced to by $var>
my $data;
$template->process( $self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error();
return $data;

решено Привет всем спасибо за ваши ответы, проблема оказалась в том, что после шаблонный процесс сделал свое дело, затем мы записали строку во временный файл перед выводом, поэтому нам также нужно было установить binmode для файла, код теперь выглядит так:

<put variables in hash referenced to by vars>
<print out variables in has referenced to by $var>
my $data;
binmode( STDOUT, ":utf8" );
$template->process( $self->filename, $vars, \$data, {binmode => ':utf8'}) || die "Template process failed: ", $template->error();
return $data;

Благодарю васвсе на ваше время :) 1026 *

Ответы [ 2 ]

9 голосов
/ 20 декабря 2010

Код ниже работает. $data, в частности, содержащиеся строки должны быть строками Perl, то есть правильно декодировать d. См. введение в кодировку в официальной документации .

use Template '2.21_02';

my $tt = Template->new({
    ENCODING     => 'utf8',
    # other options …
});

$tt->process(
    $template, $data, $output, {binmode => ':utf8'}
) or die $tt->error . ' in ' . $template;
1 голос
/ 20 декабря 2010

Мое решение состояло в том, чтобы придумать, и все нелатинские символы идут в en.po для включения во время выполнения через [% loc('string') %], и это прекрасно работает для меня, так как мои шаблоны все равно должны были быть локализованы.

...