読者です 読者をやめる 読者になる 読者になる

ざ・わーるど@はてな

気が向いた時に更新する雑記です

配列の中身の文字コードを全て変換する

PHP メモ

APIを叩いて返ってくる値がutf8だけど、スクリプトEUC-JPで作っているのでなんとかする方法を模索しましたぼく。
Smarty Pluginを作って表示のところで変換しようかと思ったけど、表示する箇所ごとに指定をしなくてはならなくて、面倒くさすぎるので却下。


配列の中身を全部変換すればいんじゃね?と思ったのでそれでいくことにしました。


なんか階層がものすごく深い配列が返ってきていてどうしたもんだろう、と思ったけど前に調べた再帰関数使えばモリモリ変換できるような気がしてなんとなくやったらうまくいったので感動してメモ。
くだらないことかもしれないけどぼくはうれしかったんです。
書き方とか正しくないかもしれないけどとりあえずメモなのでOK。
関数の名前がかっこよくつけられなかったので適当。

/**
 * 配列の中身の文字列をコンバートする
 *
 * @param  array  $tmp  変換対象の配列
 * @param  string $from 変換前の文字コード
 * @param  string $to   変換後の文字コード
 * @return array  $tmp  変換後の配列
 */
function theworld_array_xxx($tmp, $from, $to)
{
	if(is_array($tmp))
	{
		foreach($tmp as $k => $v)
		{
			$tmp[$k] = $this->theworld_array_xxx($v, $from, $to);
		}
	}
	else
	{
		$tmp = mb_convert_kana($tmp, "as", $from);
		$tmp = mb_convert_encoding($tmp, $to, $from);
		// $tmp = trim($tmp);
		// ...なんか追加
		// ...
	}
	
	return $tmp;
}

これで、変換したい配列$beforeと文字コードを指定すると、変換された配列が返ってくるようになりました。

$after = $this->theworld_array_xxx($before, "utf8", "EUC-JP");

ワーイ。
ついでなので英数字を半角化するようにしておきました。
elseの方に処理を追加していけばいろいろとまとめて変換できていいカンジ。


つーか、今度サイトを作るときはutf8で作ろうと思いました。
CSの試合するとかいってるけどまだですかね。

コメントでhaltさんに、変換するPHPの標準関数を教えてもらいました。

mb_convert_variables

(PHP 4 >= 4.0.6, PHP 5)
mb_convert_variables -- 変数の文字コードを変換する

http://jp2.php.net/manual/ja/function.mb-convert-variables.php

文字コード変換だけならこっちのほうがいいですね。