それTemplate::Provider::Encodingで一応できるよ

テンプレートShift_JISでそれ以外UTF-8の場合 - Unknown::Programmingの続き。

id:dayflowerさんに助言を頂きました。

Template::Provider::Encodingを使えばいけそうです。

Template::Provider::Encodingの存在を知ってはいたんですがてっきりテンプレートがUTF8なものを別の文字コードに変えるものだと思ってましたorz。

で使い方なんですが、テンプレートに[% USE encoding 'shiftjis' %]と書いておけばOKです。

ただテンプレート毎にUSE文を書かなければならないのが面倒ですね・・・。

まあ考え方によってはテンプレート毎に違う文字コードで書けるという利点はあるのでそれはそれでありかも。

USEしてないときのデフォルト値が今はUTF8固定なんでこれを外から変更できたらかなり使いやすそうかもです。

 --- Encoding.pm Sun Oct 22 21:44:06 2006
 +++ Encoding_patch.pm   Sat Apr 14 18:09:42 2007
 @@ -6,13 +6,21 @@
  use base qw( Template::Provider );
  use Encode;
 
 +sub new {
 +    my $class = shift;
 +    my $opt   = shift || {};
 +
 +    $opt->{defualt_encoding} ||= 'utf-8';
 +    return $class->SUPER::new($opt);
 +}
 +
  sub _load {
      my $self = shift;
      my($data, $error) = $self->SUPER::_load(@_);
 
      unless (Encode::is_utf8($data->{text})) {
          my $encoding = $data->{text} =~ /^\[% USE encoding '([\w\-]+)'/
 -            ? $1 : 'utf-8';
 +            ? $1 : $self->{PARAMS}->{default_encoding};
          $data->{text} = Encode::decode($encoding, $data->{text});
      }

こうしておけばdefault_encodingで設定した値が優先されるのでテンプレート毎にUSE文書かなくてもOKになります。違う文字コードにしたいときだけUSE文書けば良いって感じですね。

あともうひとつの問題点としてTemplate::Provider::EncodingはUTF8にしか変換できないのでEUC-JPやShift_JISなどに変換したい場合はやはりTemplate::Provider::Encodeを使わないとダメですかね。