Catalyst::Plugin::Unicode::Encodingが不思議

内部の文字コードと外部の文字コードを切り替えようとCatalyst::Plugin::Unicode::Encodingを使ってみた。

解決しました。
TTを使ってる場合はUTF-8でBOM付きに保存すればOK。

コントローラなどで文字列リテラルで日本語を使う場合はdecodeが必要ですけど普通は使わない。

けども、HTTPレスポンスのContent-Typeで変換した文字コード指定になってない。
Encodingでeuc-jpに指定しても、utf-8としてヘッダーがのこってる。

HTTP/1.x 200 OK
Connection: close
Date: Fri, 06 Jun 2008 01:28:09 GMT
Content-Length: 20
Content-Type: text/html; charset=utf-8
Status: 200
X-Catalyst: 5.7012

結局、ヘッダ書き換えの応急処置は必要か。

$c->res->content_type("text/html; charset=".$c->encoding->mime_name);

そこでどうも、動きがおかしい

  • したいこと
    • テンプレートとかをutf8で統一。
    • クライアントにはeuc-jpを送りたい。

とりあえず、文字コードを指定してプラグインをsetupしてみた。

__PACKAGE__->config(encoding => 'euc-jp');
__PACKAGE__->setup(qw(
  -Debug
  ConfigLoader
  Static::Simple
  Unicode::Encoding

で動かしてみるとutf8としてブラウザに表示される。

調べてみると、プラグイン内部のfinalizeで内部がutf8出ない場合は、そのままスルーしているように読める。
テンプレートもソースもすべてutf8にしているのに、このif分に入って終わってる。

    unless ( Encode::is_utf8( $c->response->body ) ) {
        return $c->NEXT::finalize;
    }

試しにutf8にデコードした状態にしてみて実行。

  my $encutf8 = Encode::find_encoding('utf8');
  $c->response->body( $encutf8->decode($c->response->body) );


動いたー。

でも、いつどこでデコードしろと?プラグイン内部でなんとかおさめられないかなー。
それとContent-Typeがutf-8に固定されたままなんだけど


このContent-Typeも変だよなー。ネットに同じ問題で悩んでるって情報なかったし使い方間違えてんのかなー。
とりあえず、Content-Typeも応急処置

$c->res->content_type("text/html; charset=".$c->encoding->mime_name);