CGIぽん
モバイルCGI研究(i-mode編)
2002年9月13日更新

ドットi 絵文字の処理


目次


はじめに

ドットi の絵文字は i-mode 絵文字と同様に、 Shift_JIS コード 2 バイトからなっています。そのため処理の方法は i-mode 絵文字とほとんど同じです。基本的な部分は「モバイルCGI研究(i-mode編)i-mode絵文字の処理」をご覧になって下さい。

このページではドットi 絵文字と i-mode 絵文字を同時に処理する方法を紹介します。


ドットi 絵文字の正体

ドットi 絵文字は Shift_JIS コード 2 バイトで、第一バイトが "0xF0" 〜 "0xF4" の領域に充てられています。("0x" は「16 進数ですよ」という印。)

それぞれ対応する第二バイトは下表のようになっていますが、およそ "0x40" 〜 "0xFC" の範囲内にあると考えておけば大丈夫でしょう。

第一バイト 第二バイト
F0 40〜7E、80〜FC
F1 40〜7E、80〜D5
F2 40〜7E、80〜AB、B0〜D5、DF〜FC
F3 40〜7E、80〜FA
F4 40〜4F、80、84〜8A、8C〜8E、90、94〜96、98〜9C、A0〜A4、A8〜AF、B4〜B5、BC〜BE、C4〜C5、C8、CC


絵文字除去サブルーチン

ドットi 絵文字と i-mode 絵文字を除去するサブルーチンは次のようになります。

Perl
# i-mode絵文字 ドットi絵文字 除去サブルーチン
# 2002.03.18 更新
# Shift_JISから他の文字コードに変換する前に使用すること

sub remove_emoji {

  my $old = $_[0];  # 変換前の文字列
  my $new = '';     # 変換後の文字列

  if ($old =~ /[\xF0-\xF9]/) {
    # 絵文字を含む可能性があるときだけ処理をします
    while (1) {
      if ($old =~ s/^([\xF0-\xF9][\x40-\x7E\x80-\xFC])+//) {
        # 先頭に絵文字列があった場合
        next;
      } elsif ($old =~ s/^([\x81-\x9F\xE0-\xEF\xFA-\xFC][\x40-\x7E\x80-\xFC])+//) {
        # 先頭に絵文字以外の Shift_JIS 2バイト文字列があったら
        # それを $new の後ろに連結
        $new .= $&;
      } elsif ($old =~ s/^.//) {
        # 先頭が ASCII または 半角カナ 1バイトの場合
        $new .= $&;
      } else {
        # $old がなくなったのでループを抜けます
        last;
      }
    }
  } else {
    # 絵文字はないのでそのまま代入
    $new = $old;
  }
  return $new;

}

# 呼び出し方の例
$str = &remove_emoji($str);

また、これと同等の変換をパターンマッチ(置換文)で書くと次のようになります。

Perl
# i-mode絵文字 ドットi絵文字 除去置換文
# 2002.03.18 更新
# Shift_JISから他の文字コードに変換する前に使用すること

$sjis  = '[\x81-\x9F\xE0-\xEF\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
$emoji = '[\xF0-\xF9][\x40-\x7E\x80-\xFC]';
$str =~ s/\G((?:$sjis)*)(?:$emoji)/$1/go;

絵文字変換サブルーチン

ドットi 絵文字と i-mode 絵文字を "&#数字;" (10進数表記)に変換するサブルーチンは次のようになります。この形式に変換しておけば、 jcode.pl などで文字コード変換を行なっても文字化けを起こすことはありません。

Perl
# i-mode絵文字 ドットi絵文字 変換サブルーチン
# 2002.03.18 更新
# Shift_JISから他の文字コードに変換する前に使用すること

sub replace_emoji {

  my $old = $_[0];  # 変換前の文字列
  my $new = '';     # 変換後の文字列

  if ($old =~ /[\xF0-\xF9]/) {
    # 絵文字を含む可能性があるときだけ処理をします
    while (1) {
      if ($old =~ s/^[\xF0-\xF9][\x40-\x7E\x80-\xFC]//) {
        # 先頭に絵文字列があった場合
        # 10進数表記にして $new に連結
        $new .= '&#' . unpack('n', $&) . ';';
      } elsif ($old =~ s/^([\x81-\x9F\xE0-\xEF\xFA-\xFC][\40-\7E\80-\FC])+//) {
        # 先頭に絵文字以外の Shift_JIS 2バイト文字列があったら
        # それを $new の後ろに連結
        $new .= $&;
      } elsif ($old =~ s/^.//) {
        # 先頭が ASCII または 半角カナ 1バイトの場合
        $new .= $&;
      } else {
        # $old がなくなったのでループを抜けます
        last;
      }
    }
  } else {
    # 絵文字はないのでそのまま代入
    $new = $old;
  }
  return $new;

}

# 呼び出し方の例
$str = &replace_emoji($str);

また、これと同等の変換をパターンマッチ(置換文)で書くと次のようになります。

Perl
# i-mode絵文字 ドットi絵文字 変換置換文
# 2002.03.18 更新
# Shift_JISから他の文字コードに変換する前に使用すること

$sjis  = '[\x81-\x9F\xE0-\xEF\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
$emoji = '[\xF0-\xF9][\x40-\x7E\x80-\xFC]';
$str =~ s/\G((?:$sjis)*)($emoji)/$1.'&#'.unpack('n',$2).';'/ego;

絵文字の出力法

「モバイルCGI研究(i-mode編)i-mode絵文字の処理」絵文字の出力法を参考にしてください。


関連リンク

公式サイト
ドットi対応HTML仕様
アステル絵文字
CGIぽん
モバイルCGI研究(i-mode編)i-mode絵文字の処理
モバイルCGI研究(J-SKY編)J-SKY絵文字の処理

このページの履歴

2002.09.13
除去・変換の例を更新。何ヶ所かタイプミスをしていました。ご迷惑をおかけしました。
2002.03.18
除去・変換の例を更新。半角カナの存在を見落としていました。
2001.12.29
除去・変換の例の /x 修飾子を間違って記述していたのを修正。ご迷惑をおかけしました。
2001.11.05
初版。

CGIぽんはINFOJAMの安価で快適なサーバを利用しています。