MagentoのShift_JIS変換

最近、友人のサイトを手伝うためにEコマースのオープンソースで有名なMagentoを使ってみた。で、内部的にはUTF-8のMagentoを日本の携帯電話用にShift_JIS変換する必要があったのですが、ネットでいろいろ探してみたが、文字コード変換はあまり対応されていない様子。ということで、半ば強引ではありますがShift_JISに変換してみた。もっといい方法があったらどなたか教えてください。

まずは出力についてしないといけないのは、

  • 出力する文字コードをUTF-8からShift_JISに変換
  • 出力時のHTTPヘッダー情報の文字コードをUTF-8からShift_JISに変更
  • 出力するHTMLヘッダー内のメタタグにもShift_JISを設定

そして入力時は、

  • 入力された文字をShift_JISからUTF-8へ変換

1.出力する文字コードをUTF-8からShift_JISへ変換

出力する箇所一つ一つに文字変換を入れようかとも考えたが、表示するページ数が半端ないため、どこか一カ所で変換できないか考えた。で、最終的にしたのが、すべてのアクセスが通過するindex.phpでの出力バッファリングを使った変換。ソースコードを調べるとob_start()を利用しているところがいくつかあったのですが、出力している箇所はなさそうだったので、試してみたらうまく?いきました。画面表示を確認してますが、今のところは問題なさそうな感じです。

	
ob_start();
Mage::run($mageRunCode, $mageRunType);
$content = ob_get_contents();
ob_end_clean();
echo mb_convert_encoding($content,'sjis-win','utf-8');

2.出力時のHTTPヘッダー情報の文字コードをUTF-8からShift_JIS変換

1で出力文字コードをShift_JISに変換したとしても、Magentoの場合、HTTPヘッダー内でcharsetをUTF-8に設定しているため、ブラウザが文字コードをUTF-8だと判断し、文字化けしてしまいます。ということで、ソースコードを調べたところ
/app/code/Mage/core/Model/App.phpのgetResponseメソッド内で設定してましたので、この文字コードを以下のようにShift_JISへ修正。

	
//$this->_response->setHeader("Content-Type", "text/html; charset=UTF-8");
$this->_response->setHeader("Content-Type", "text/html; charset=Shift_JIS");

3.出力するHTMLヘッダー内の文字コードをShift_JISに修正

もちろん、出力するHTMLの<head>内でShift_JISの文字コードを宣言しておく。ソースはデザインによりますが、一般的には、カスタムデザイン配下のpage/html/head.pthmlあたりでしょう。

<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=shift_jis" />

4.入力された文字をShift_JISからUTF-8へ変換

これが一番強引なところ(もちろん、他も強引なのですが。。)。あまりしたくはなかったのですが、最終的には、Zendのソースに手を入れることにしました。
/lib/Zend/Controller/Request/Http.phpに文字コード変換メソッドを追加し、getPostメソッドも以下のように修正。

public function getPost($key = null, $default = null)
{
	$array = $this->mbConvert($_POST); // $_POSTの文字コードを変換
	if (null === $key) {
		return $array;
	} 

	return (isset($array[$key])) ? $array[$key] : $default;
}

Public function mbConvert($array) // 追加したメソッド
{
	$tempArray = array();
	foreach( $array as $key=>$val )
	{
		if( is_array($val) ){
			$tempArray[$key] = $this->mbConvert($val);
		} else {
			$tempArray[$key] = mb_convert_encoding($val,'utf-8','sjis-win');
		}
	}

	return $tempArray;
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s