catalyst.perl.kmtz.net RSSフィード

 | 

2007-05-14Catalyst::Plugin::Unicode::Encoding で動的に文字コードを指定したい このエントリーを含むブックマーク

携帯キャリア判定を行って出力の文字エンコードを変更するなんてことはよくあるんじゃないかと思うけど、イマイチやり方がわからない。

最初はテンプレートは全て utf8 なので、Catalyst::Plugin::Unicode::Encoding でできるのかなと思った。このプラグインだと、myapp.yml の中に encoding を設定しておくと変換して出力してくれる。だが、コントローラ携帯キャリア判定をして、そこで動的に文字コードを指定しようと思うとできなさげ。

実際に Catalyst::Plugin::Unicode::Encoding のソースコードを読むと、sub encoding の中で ref($c) で処理が分岐していて、MyApp->setup から sub setup 経由で呼ばれた場合と、Catalyst::Plugin::Unicode::Encoding->encoding と直接呼ばれた場合の両方に対応しようという意図が見える(気がする)。

前者後者$c が別物なのでわかりにくいが、前者ではエンコード情報Catalyst->{'encoding'} に格納し、後者では Catalyst::Plugin::Unicode::Encoding::_encoding に格納しているように読める。しかし、sub finalize の中では Catalyst->{'encoding'} しか見ていない。だから、Catalyst::Plugin::Unicode::Encoding->encoding で設定しても無視されるようだ。

ためしに、sub finalize の中で

$c->log->debug(__PACKAGE__->_encoding->mime_name);

$c->log->debug($c->encoding->mime_name);

とやると、前者Shift_JIS と表示しても、後者UTF-8 だったりする。

そこで、下記のように変えてみた

     unless ( Encode::is_utf8( $c->response->body ) ) {
         return $c->NEXT::finalize;
     }
-    $c->response->body( $c->encoding->encode( $c->response->body, $CHECK ) );
+    my $encoding = __PACKAGE__->_encoding || $c->encoding;
+    $c->response->body( $encoding->encode( $c->response->body, $CHECK ) );
+    __PACKAGE__->_encoding('');

     $c->NEXT::finalize;
 }

これでうまくいったように一瞬思えた。

しかし、Catalyst::Plugin::Unicode::Encoding は sub prepare_parameters でも設定された文字コードとして、HTTPで渡されてたパラメータを utf8 フラグ付きの文字列に変換している。この部分は finalize と違ってコントローラが受け取る前に処理してしまうので、キャリア判定後なんてことは原理的に不可能に思える。そうなると文字コード推測するようにするしかないのかな?

というわけで、同じような要件をクリアされた方がいらっしゃったら解決方法もしくはアドバイスをいただきたく。

全然勘違いなこと言っているよという指摘でもありがたいです。

ちなみに、上記 diff の最後の __PACKAGE__->_encoding(''); は mod_perl 環境下なので、Catalyst::Plugin::Unicode::Encoding->encoding を一度どれかのリクエストの際に呼び出すと、以降のリクエストでは、同様に上書きするまでデフォルトの設定ではなく Catalyst::Plugin::Unicode::Encoding->encoding の設定が共有されてしまうのを防ぐため。ただ、場合によっては初期化前に別のリクエストが finalize フェーズを通過する場合も考えられるので、そもそもクラス変数を使うことが間違い?(意図が違う?)

(追記5/19)とりあえず書いてみた。

http://catalyst.g.hatena.ne.jp/yosty/20070519

StretchStretch2011/08/03 01:17Never seen a betetr post! ICOCBW

lzewlcgtlzewlcgt2011/08/04 23:24S6pjC3 , [url=http://lyrveoxfeked.com/]lyrveoxfeked[/url], [link=http://wfddcwssxuwv.com/]wfddcwssxuwv[/link], http://ykmomoagsbuq.com/

nhptvwinhptvwi2011/08/05 18:37funD8f <a href="http://mvcxofnjkpzh.com/">mvcxofnjkpzh</a>

gvufwnigvufwni2011/08/07 00:29olf4UE , [url=http://jqbtuuxezjly.com/]jqbtuuxezjly[/url], [link=http://dtztkmqcthhu.com/]dtztkmqcthhu[/link], http://gizqexqurazy.com/

 |