アトトックラボ

2011年4月04日

HTML::Template と XML::Simple を組み合わせると日本語が文字化けする件の解決策

Posted by Nobuyuki Sato

個人的にはじめた新サービスのα版で、HTML::Template と XML::Simple を組み合わせて使っているのですが、文字化けする件を検証してみました。

普通に UTF-8 で書かれたテンプレートファイルを扱い、その中に XML::Simple で取得した値を入れると、XML::Simple で取得した値自体に UTF-8 フラグが立って、テンプレートファイルの方が文字化けしてしまうようです。なので以下のように。

#! /usr/bin/perl -w
use strict;
use HTML::Template;
use XML::Simple;
use Encode;

my $tmpl = HTML::Template->new(filename => "sample.tmpl");

~ 中略 (ここで XML::Simple で RSS を取得したりする) ~

my $value = (XML::Simple で取得した値);
$value = Encode::encode_utf8($value);

$tmpl->param('sample', $value);

print "Content-Type: text/html¥n¥n";
print $tmpl->output;

こんな感じです。以下のように、予めテンプレートファイルを開く時に文字コードを指定してやる方法もあるのですが、HTML::Template の TMPL_INCLUDE を使った時に、インクルードされるファイルが文字化けしてしまうので、上の方法にしました。

#! /usr/bin/perl -w
use strict;
use HTML::Template;
use XML::Simple;
use Encode;

my $tmpl;
open (my $template, "<:utf8", "sample.html");
	$tmpl = HTML::Template->new(filehandle => *$template);
close $template;

~ 中略 (ここで XML::Simple で RSS を取得したりする) ~

my $value = (XML::Simple で取得した値);

$tmpl->param('sample', $value);

print "Content-Type: text/html¥n¥n";
print $tmpl->output;

今回は以上な感じです。