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サンプル
最近の記事