PHPを使ってたった2行で絵文字をエスケープする方法
Tweet
先日の「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上では絵文字は表示できませんので、「晴れ」の部分は絵文字を入力し直してください。
実行例:

「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;
実行例:

関連:
- PHPを使ってたった2行で絵文字を取り除く方法
- iモード絵文字をSJIS形式からUnicode形式に変換するPHPサンプル
- iモード絵文字をUnicode形式からSJIS形式に逆変換するPHPサンプル
Flash プロの現場の仕事術 CS5/CS4/CS3対応
体系的に学ぶ 安全なWebアプリケーションの作り方
ケータイHTML ポケットリファレンス
携帯サイト年鑑2010
PHP×携帯サイト デベロッパーズバイブル
携帯Flashスクリプト入門
ケータイHTMLコンパクトリファレンス
札幌のソーシャルゲーム開発なら

最近の記事