萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

auの絵文字を除去する話、続きの続き

前にauの絵文字を除去する話を書いたとき、

で、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;
}
?>

でしょうか。

しかし、絵文字の一覧表があるのは助かるけど、バイト列の範囲(って言い方あってるかな)をまとめたものぐらい、公式サイトに置いておけば良いのに。あと、それこそ正規表現とかも。探せてないだけかもしれないけど、そんなの、すぐ見つかる場所に置かれてないんだったら、ないのと同じだわな。

そんなわけで、正規表現が苦手な僕の絵文字との戦いは、なかなか終わらないのでした。

てか、今回で終わっててほしいのですが如何でしょうか。