7

似乎模板工具包没有正确处理编码。

我传递template->process了一个文件名(从哪里获取模板)、一个哈希引用(包含所有参数)和一个标量引用(将输出放在哪里),然后我将其返回并依次显示给用户。

当我给它一个带有变音符号的字符串时,html输出包括一个黑色菱形,每个字母都用一个白色问号代替(但字母的数量是正确的)。任何其他角色都很好。

在调用 template->process 之前,我正在使用警告打印出字符串,此时它很好,据我所知,在template->process调用过程中事情变成了垃圾。

有任何想法吗?我试过使用ENCODING => "utf8"as well ,binmode => ":utf8"但对输出没有任何影响。

这是我的代码,去掉了一些脂肪,只是为了显示我对模板-> 进程的调用,请注意,如果我省略{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;

我感谢大家的时间:)

4

2 回答 2

11

下面的代码有效。$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;
于 2010-12-20T08:32:15.387 回答
1

我的解决方案是平底船,所有非拉丁字符都进入 en.po 以在运行时包含在内,[% loc('string') %]这对我来说很好,因为无论如何我的模板都必须本地化。

于 2010-12-20T02:08:03.020 回答