背負い投げとENTER_FRAME

Icon

なんちゃってWebクリエイターがFlashやらActionScriptやらを淡々と書く。ときとき柔道の話しもする。

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>

他にいい方法があればぜひ教えてほしい。

このエントリーをはてなブックマークに追加  

Category: PHP, WEB全般

Tagged: , , , ,

One Response

  1. […] に関係あるようだ。Apacheの設定(mbstringあたりとあ)を変えてみたけどだめ。一晩苦悩した結果、送信前にエンコード処理するという方法で解決! 詳細の解決策は次のエントリーで。 […]

Leave a Reply

中の人のプロフィール

柔道歴約20年だが諸理由で未だ初段。162cm、60kgくらいの軽量級。得意は背負い投げと巴投げ。2009年、左ヒザ前十字靭帯損傷。ただ今柔道復帰を企んでいる真っ最中。仕事では最近、ActionScriptを書いたり、WordPressをいじったりの日々が続いてる。@renowanにてつぶやいてる。

アーカイブ

Flicker

This movie requires Flash Player 9.0.0