5月 11, 2011
Ajaxでの文字化け対策
前記事のAjax文字化けの続き。ググってみたら、使用ライブラリは関係なく、結構Ajaxで文字化けを遭遇した人が多いみたい。
・Apacheのmbstring設定を換える。
・全ファイルUTF-8にする。
とやってもだめだった。
あれやこれや試した結果、ちょっと面倒だけどPHPへ送信する前と、JavaScriptへコールバックする前に、それぞれエンコードしておけば回避できた。AJASONの場合、直でメソッドを呼ぶじゃなく、いったん自前の関数で引数をエンコードしておいてからAJASONの処理に渡すことがカギ。
ファイル一式をどうぞ。
<?php require_once( './php/Ajax.php' ); class MyClass { public function getResult( $target ) { // *** 重 要 *** エンコードしてからPHPへ送信 *** 重 要 *** $target = urldecode( $target); /* * * ここは普通に引数を返すが、 * もとの目的は引数でMySQLクリエを発行すること。 * Ext: "SELECT * FROM HogeTabke WHERE xxx LIKE '".$target."%'" * 取得した結果はそのままreturnして大丈夫みたい(文字化けしない)。 * */ return $target; } } $ajax = new Ajax(); // 使用するクラス、メソッドを記入 $ajax->registerMethod( 'MyClass', 'getResult' ); $ajaxServer = $ajax->getServer(); if ( $ajaxServer->isRequest() ) { echo $ajaxServer->handleRequest(); exit(); } $ajaxClient = $ajax->getClient(); ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>AJAX example</title> <script type="text/javascript" src="./js/json.js"></script> <script type="text/javascript" src="./js/ajax.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> <?php echo $ajaxClient->getJavaScript(); ?> function reWrite_cb( response ) { // jQueryでPタグの内容を書き換える。 $("p").text(response); } function getResult_Apter( targ ) { // *** 重 要 *** エンコードしてからPHPへ送信 *** 重 要 *** targ = encodeURI(targ); x_MyClass.getResult(targ,reWrite_cb); } </script> </head> <body> <p>返り値</p> <br/> <!-- x_ + クラス名でメソッドを読み出す --> <!-- クラスを使わず、functionを直に記述もできる。詳細はAJASON付属のサンプルを参照 --> <div><a href="javascript:void(0)" onclick="x_MyClass.getResult('これだと化ける',reWrite_cb );">直で送信すると化ける</a></div> <div><a href="javascript:void(0)" onclick="getResult_Apter('なにかの日本語' );">アダプタ経由で回避</a></div> </body> </html>
他にいい方法があればぜひ教えてほしい。
[…] に関係あるようだ。Apacheの設定(mbstringあたりとあ)を変えてみたけどだめ。一晩苦悩した結果、送信前にエンコード処理するという方法で解決! 詳細の解決策は次のエントリーで。 […]