PHPを使ってたった2行で絵文字をエスケープする方法
    このエントリをはてなブックマークに登録

先日の「PHPを使ってたった2行で絵文字を取り除く方法」の応用技です。

SJIS形式の絵文字は、そのままだとDBに格納する際や文字コード変換時に、文字化けを起こしてしまうことがあります。

iモードの場合は、先日ご紹介した、
iモード絵文字をSJIS形式からUnicode形式に変換するPHPサンプル
の方法でもエスケープできますが、ドコモのみの方法ですし、やや面倒です。

今回はもっと簡単にエスケープする方法をご紹介します。
この方法であれば、DoCoMo・au・SoftBank(SJIS形式のみ)の絵文字は全てエスケープできますし、後で元に戻すこともできます。

 

エスケープ処理 サンプルコード

$str = '絵文字[晴れ]';
mb_substitute_character('long');
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

// 出力
echo $str;

※ソースはSJISで記述します
※Blog上では絵文字は表示できませんので、「晴れ」の部分は絵文字を入力し直してください。

実行例:
emoji_escape1.gif

 

mb_substitute_character」は、存在しない文字コードがある場合(いわゆるゲタになる場合)の処理を設定するためのものです。
「long」を指定すると、存在しない文字は「BAD+[SJISコード]」という文字列に置換されます。
次の「mb_convert_encoding」で実際に変換を行うと(ダミーのためSJIS→SJISでOK)、絵文字がエスケープされる仕掛けです。

 

変換後のデータを元に戻すサンプルは次の通りです。

逆エスケープ処理 サンプルコード

$str = '絵文字BAD+F89F';

// 絵文字を検索
$pattern = "/BAD\\+[0-9A-F]{4}/";
preg_match_all($pattern, $str, $arr); // $arr[0]に対象絵文字が格納される

// 絵文字に置換
$rep_arr = array();
foreach($arr[0] as $value) {
	$dec = hexdec(substr($value, 4, 4));
	$rep_arr[$value] = pack('n', $dec);
}

// 置換処理
$str = strtr($str, $rep_arr);

// 出力
echo $str;

実行例:
emoji_escape2.gif

 

関連:


 

最近の記事







コメントを書く