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あたりとあ)を変えてみたけどだめ。一晩苦悩した結果、送信前にエンコード処理するという方法で解決! 詳細の解決策は次のエントリーで。 […]