で、auの場合は、
<IMG ICON="85">みたいにIMGタグになってるんで、まあ処理もラクなわけなんですが。
とか書いてたんだけど、最近の機種では(というほど最近じゃない機種でも)、普通に絵文字が入力できるようになってるみたいなのね・・・。上記の日記で引用してる資料にも「KDDI絵文字用Shift-JISコード」っていう項目があって、よくよく考えれば当然なのでありますが。
というわけで、反省しつつ調べてみました。auの絵文字の範囲。PDFに書いてあるものをまとめると、
- F340-F37E
- F440-F47E
- F640-F67E
- F740-F77E
- F380-F3FC
- F480-F48D
- F680-F6FC
- F780-F7FC
となって、正規表現を使ってPerlで除去スクリプトを書くと、
my $SJIS_CHARS = '(?:[\x00-\x7F\xA1-\xDF]|(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))'; # iモード $char =~ s/\G(${SJIS_CHARS}*?)(?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])|(?:\xF9[\xB1-\xFC])/$1/g; # SoftBank $char =~ s/\G(${SJIS_CHARS}*?)\x1B\x24[E-G].*?\x0F/$1/g; # au $char =~ s/\G(${SJIS_CHARS}*?)(?:[\xF3-\xF4][\x40-\x7E]|[\xF6-\xF7][\x40-\x7E]|\xF3[\x80-\xFC]|\xF4[\x80-\x8D]|[\xF6-\xF7][\x80-\xFC])/$1/g;
となりますかね。
xオプションを付けて見やすくすると、
# au $char =~ s/ \G (${SJIS_CHARS}*?) (?: [\xF3-\xF4][\x40-\x7E] | [\xF6-\xF7][\x40-\x7E] | \xF3[\x80-\xFC] | \xF4[\x80-\x8D] | [\xF6-\xF7][\x80-\xFC] ) /$1/gx;
となりますかね(試してない)。
PHPだと、
<?php define(REMOVE_EMOJI_SJIS_CHARS, '(?:[\x00-\x7F\xA1-\xDF]|(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))'); function smarty_modifier_remove_emoji($string) { // iモード $string = preg_replace('/\G(' . REMOVE_EMOJI_SJIS_CHARS . '*?)(?:\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x50-\x52\x55-\x57\x5B-\x5E\x72-\x7E\x80-\xB0])|(?:\xF9[\xB1-\xFC])/', '$1', $string); // SoftBank $string = preg_replace('/\G(' . REMOVE_EMOJI_SJIS_CHARS . '*?)\x1B\x24[E-G].*?\x0F/', '$1', $string); // au $string = preg_replace('/\G(' . REMOVE_EMOJI_SJIS_CHARS . '*?)(?:[\xF3-\xF4][\x40-\x7E]|[\xF6-\xF7][\x40-\x7E]|\xF3[\x80-\xFC]|\xF4[\x80-\x8D]|[\xF6-\xF7][\x80-\xFC])/', '$1', $string); return $string; } ?>
でしょうか。
しかし、絵文字の一覧表があるのは助かるけど、バイト列の範囲(って言い方あってるかな)をまとめたものぐらい、公式サイトに置いておけば良いのに。あと、それこそ正規表現とかも。探せてないだけかもしれないけど、そんなの、すぐ見つかる場所に置かれてないんだったら、ないのと同じだわな。
そんなわけで、正規表現が苦手な僕の絵文字との戦いは、なかなか終わらないのでした。
てか、今回で終わっててほしいのですが如何でしょうか。