2010-12-20 62 views
5

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

我通过template->process一个文件名(在哪里得到模板),一个散列引用(包含所有参数)和一个标量引用(在哪里放置输出),然后我返回并显示它到用户。

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

我使用警告打印出来的字符串之前,我打电话给template->进程,在这一点上,它是好的,从我可以告诉它是在template->process调用中,事情变成垃圾。

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

这里是我的代码与一些脂肪修剪出来只是为了显示我的电话template->过程,请注意,如果我离开了{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; 

我感谢大家的时间:)

+0

可能不相关,通过尝试传递UTF-8而不是utf8。有时它很重要,例如http://jeremy.zawodny.com/blog/archives/010546.html – Hugmeir 2010-12-20 01:50:58

+2

UTF-8文本是否受到损坏或者浏览器是否只是没有选择正确的编码? – 2010-12-20 02:08:55

+0

如果是后者,我怎么能告诉浏览器使用什么编码?使用HTML模板专业版(我们正在移动的系统)中的字符显示正确。这让我相信这是TT,但我可能是错的。现在在火车上,所以我明天早上将不得不尝试任何建议。 – cjh 2010-12-20 02:18:24

回答

6

下面的代码工作。 $data,特别是包含的字符串必须是Perl字符串,即正确decode d。请参阅introduction to encoding in the official documentation

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

我认为这正是自杀意味着他在原始问题中所说的尝试,不是吗? – 2010-12-20 20:04:33

+0

号他说这不起作用,我断言它确实有效。我还写了关于谜题中缺失的一部分。 – daxim 2010-12-21 10:56:26

+0

接受,即使这是我写的,这也回答了我问的问题。模板工具包正在处理编码罚款。谢谢大家。 – cjh 2010-12-21 20:45:41

1

我的解决办法是为p并且所有非拉丁字符都会在en.po中通过[% loc('string') %]在运行时包含,并且对我来说工作正常,因为我的模板必须已本地化。

+0

感谢您的回复,但在我的情况下,这是用户提供的数据,有很多很多模板,所以这不是一个真正的选项 – cjh 2010-12-20 02:25:08

+1

@suicideducky - 然后尝试Template :: Plugin :: Decode并使用'| |解码“后,你的每个用户字符串 – 2010-12-20 20:36:54