Zend_View_Filterで文字コード変換するときの問題

前提条件

Zend_Frameworkで、内部エンコーディングとしてUTF-8を利用しているWebアプリケーションを構築していて、一部ページのみガラケー(SHIFT_JIS)対応したい。

問題

Zend_View_FilterでUTF-8からSHIFT_JIS変換するフィルターを作り、ガラケー用コントローラのinitで

public function init()
{
  $this->view->addFilter('文字コード変換フィルター名');
}

とかしてみた。すると、一見ちゃんと文字コード変換がかかったかと思いきや、一部文字化けしている。

調べてみると、addFilterしたフィルターはZend_Viewがレンダリング処理を走らせるたびに実行されるんで、レイアウトとかを使って内部で複数回Zend_View::renderされてしまうと、その部分で複数回文字コード変換がかかる→文字化けする、ということらしい。

ZendFrameworkで文字コード変換 – slumbersでは、Zend_Layout_Controller_Plugin_layoutを拡張したクラスで出力時に変換をかけたらうまくいったよって話が書いてあるけど、もうちょい楽な方法ないかなー。

解決策

複数回フィルターがかかるのがいやなら、出力する文字列が最後まで確定した後にフィルターがかかればいいんじゃないか、ということで、ガラケー用のレイアウトファイルの一番最後に、

<html>
....(省略)
<?php echo $this->layout()->content; ?>
....(省略)
</html>
<?php $this->addFilter('文字コード変換フィルター名');

とかしてみた。うまくいった。

関連する投稿: