モバイルCGI研究(i-mode編)
|
2002年9月13日更新 |
ドットi の絵文字は i-mode 絵文字と同様に、 Shift_JIS コード 2 バイトからなっています。そのため処理の方法は i-mode 絵文字とほとんど同じです。基本的な部分は「モバイルCGI研究(i-mode編)i-mode絵文字の処理」をご覧になって下さい。
このページではドットi 絵文字と i-mode 絵文字を同時に処理する方法を紹介します。
ドット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絵文字の処理」絵文字の出力法を参考にしてください。
CGIぽんはINFOJAMの安価で快適なサーバを利用しています。
|
CGIぽん (C)Copyright 2000-2002 OGATA,Tetsuji
|