7

テンプレート ツールキットがエンコーディングを適切に処理していないようです。

template->processファイル名 (テンプレートを取得する場所)、ハッシュ参照 (すべてのパラメーターを含む)、およびスカラー参照 (出力を配置する場所) を渡し、それを返し、ユーザーに表示します。

ウムラウトを含む文字列を指定すると、html 出力には、すべての文字の代わりに白い疑問符が付いた黒いひし形が含まれます (ただし、正しい文字数)。それ以外のキャラは問題なく出ます。

template->process を呼び出す前に警告を使用して文字列を出力していますが、この時点では問題ありtemplate->processません。呼び出し中に物事がガベージに変わることがわかります。

何か案は?ENCODING => "utf8"同様に使用してみまし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 文字列でなければなりません。つまり、適切にデコードされます。公式ドキュメントのエンコーディングの概要を参照してください。

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

My solution was to punt, and all non-latin characters go in en.po to be included at runtime via [% loc('string') %] and that works fine for me since my templates had to be localized anyway.

于 2010-12-20T02:08:03.020 に答える