なんだかすごいタイトルだなw
今日絵文字の抽出ロジックを書く機会があったのですが、
思ったより探し物が見つからなかったので記述
間違っていたら教えてください。
■絵文字領域(docomo)
sjis:[\xF8\xF9][\x40-\x7E\x80-\xFC] utf8:\xEE[\x98-\x9D][\x80-\xBF]
■絵文字領域(au)
sjis:[\xF3\xF4\xF6\xF7][\x40-\x7E\x80-\xFC] utf8:(?:\xEE[\xB1-\xB3\xB5\xB6\xBD-\xBF]|\xEF[\x81-\x83])[\x80-\xBF]
■絵文字領域(softbank)
sjis:[\xF7\xF9\xFB][\x41-\x7E\x80-\x9B\xA1-\xFA] utf8:\xEE[\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF]
処理内容は一応内部コードがsjisでもutf8でも対応できるように作成しました。
その他必要だった処理の抜粋(サンプル)
■前提条件
・端末はdocomo
・内部エンコードはutf8
<?php public function execute(){ $text = '[太陽の絵文字]だよ'; //sjis-winに変換 $text = mb_convert_encoding($text, 'SJIS-WIN', 'UTF-8'); //絵文字領域 $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]'; //絵文字を16進数に置換 $text = preg_replace_callback("/$emoji/",array($this,'convertToHex'),$text); //おそらくこの時点で$textは「f89fだよ」となっているはず //例えば絵文字の設定ファイルを読み込んだとして(本当はもっといろいろ入るdocomoなら256個の絵文字分) $code = array(array('key'=>1,'alt'=>'晴れ','sjis'=>'f89f')); $converted = '' foreach($code as $value){ //絵文字があったら if(stristr($text, $value['sjis'])){ $converted = str_ireplace($value['sjis'],"[i=" . $value['key'] . "]",$text); } } //表示する為にutf8に戻す return mb_convert_encoding($converted, 'UTF-8', 'SJIS-WIN'); } /** * 16進数に変換(コールバック用) * * @access public */ private static function convertToHex($matches){ return bin2hex($matches[0]); } ?>
ものすごくはしょって書きましたが処理の流れはこんな感じっす。
ご指摘等ありましたらぜひ教えてくださいm(__)m
本来class内で処理を書いてるのでpreg_replace_callbackの引数がarray($this,'convertToHex')になってますが
そこはマニュアル見てください。
いや、マジ大変でしたこれはかなり限定的なサンプルですが、
これの応用で3キャリアsjis,utf-8の内部コードに対応できると思います。
これ以外に設定ファイルキャリア間の絵文字コンバートファイルを作成したりと地味な作業が結構あったりします
教えてくれた皆さんにも感謝です。