CakePHP PHPの文字コードと入出力データの文字コードが異なる場合の対処

PHP
CakePHP

携帯向けサイトを開発する場合や、レンタルサーバーでPHPの文字コードがEUC-JPに設定されてしまっている場合の対処方法です。

  • UTF-8でHTMLを表示したいが、PHPがEUC-JPに固定されてしまっている場合。

headerでHTML出力を指定します。
POSTパラメーターの文字コードはheaderと同じですが、GETパラメーターが文字コード変換されてしまっている場合、UTF-8に変換します。

 class AppController extends Controller {
 	function beforeFilter() {
 		parent::beforeFilter();
 	
 		$this->header("Content-type: text/html; charset=utf-8");
 		if(isset($this->params['url'])) {
 			array_walk_recursive($this->params['url'], 
  					'&$val, $key',

‘$val = mb_convert_encoding($val, “UTF-8”, “auto”);’

 				)
 			);

}

 	}
 }

※CakePHP 1.3.8ではRequestHandler::RespondAsは、Content-Disposition以外のheaderを出力しません。
http://api.cakephp.org/view_source/request-handler-component/#line-702

headerの二重送出を防ぐために、このような状態になってしまっているようです。
http://cakephp.lighthouseapp.com/projects/42648/tickets/842

  • 出力HTMLの文字コードをEUC-JPに変換する例です。

フォームなどでは、上記例のようにbeforeFiterで$this->data等をUTF-8に変換する必要があります。

 class AppController extends Controller {
 

function afterFilter(){

 		parent::afterFilter();
 	
 		$this->output = mb_convert_encoding($this->output, "EUC-JP", "UTF-8");
 	}
 }
  • array_walk_recursive()の情報ありがとうございます。途中、create_function(‘&$val, $key’,の指定が抜けているようです。 — {2011-08-04 (木) 22:17:53}
  • ご指摘、ありがとうございます。 — 管理者 {2011-08-05 (金) 19:04:36}
カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です