Home

技術日記PHPZendFramework
Zend_View_Filterで文字コード変換するときの問題Edit

前提条件

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

問題

ZendViewFilterでUTF-8からSHIFT_JIS変換するフィルターを作り、ガラケー用コントローラのinitで
[sourcecode language="php"]
public function init()
{
  $this->view->addFilter('文字コード変換フィルター名');
}
[/sourcecode]
とかしてみた。すると、一見ちゃんと文字コード変換がかかったかと思いきや、一部文字化けしている。

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

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

解決策

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

....(省略)
<?php echo $this->layout()->content; ?>
....(省略)

<?php $this->addFilter('文字コード変換フィルター名');
[/sourcecode]
とかしてみた。うまくいった。

Published At2011-11-30 21:52Updated At2019-12-30 15:06