2010-12-20 18 views
5

テンプレートツールキットが正しくエンコーディングを処理していないようです。テンプレートツールキットの文字エンコーディング

ファイル名(テンプレートを取得する場所)、ハッシュリファレンス(すべてのパラメータを含む)、およびスカラーリファレンス(出力先を指定)を渡してから、それを返して順番に表示しますユーザー。

ウムラウト付きの文字列を入力すると、html出力には、すべての文字の代わりに白い疑問符(ただし、正しい文字数)の黒い菱形が含まれます。他のキャラクターはうまく出てきます。

テンプレート - >プロセスを呼び出す前に警告を使用していますが、この時点では、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; 

私はあなたのすべてに感謝し、あなたの時間のために:)

+0

おそらくutf8ではなくUTF-8を渡してみてください。時には重要です。例えば、http://jeremy.zawodny.com/blog/archives/010546.html – Hugmeir

+2

UTF-8のテキストが文字化けしているのですか、ブラウザが正しいエンコーディングを選んでいないのですか? –

+0

後者の場合は、どのようなエンコーディングを使用するのかブラウザにどのように伝えることができますか? HTMLテンプレートpro(私たちが移動しているシステム)を使用すると、文字が正しく表示されます。これは私がTTだと信じさせたが、私は間違っている可能性がある。私は明日の朝にどんな提案も試してみる必要があります。 – cjh

答えて

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

私はこれがまさに自殺願人が元の質問で試したと言ったものだと思いますか? –

+0

No.彼はそれがうまくいかないと言った、私はそれが動作すると主張した。私はまたパズルの欠けている部分について書いた。 – daxim

+0

私が書いたものであっても、これは私が尋ねた質問にも答えます。テンプレートツールキットは、コードを細かく処理しています。皆さんありがとう。 – cjh

1

私のソリューションは、pにしましたすべての非ラテン文字は、実行時に[% loc('string') %]を経由してen.poに含まれているので、テンプレートはローカライズされていなければならないので、うまく動作します。

+0

あなたの返事をお寄せいただきありがとうございます。私のケースではこれはユーザが提供するデータであり、多くのテンプレートがありますので、実際にはこれはオプションではありません – cjh

+1

@suicideducky - 次にTemplate :: Plugin :: Decodeを試して、 '|あなたのユーザーストリングのそれぞれの後にデコードしてください –

関連する問題