新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mvg.biglobe.ne.jp>
Subject: Re: 特殊文字の抜き出しについて
Date: 2000/06/08 01:12:29
Reference: mesh.program/00697

6月6日に、くろみつさんは書きました。

>掲示板のCGIを作成中ですが、imode,PC,EZでも共通に見れるようにしているのですが、
>imodeの絵文字が、PCでは文字化けですんでいるのですが、EZになると、コンパイルエラーが出るのです。
>そこで、EZに表示する時のみ絵文字(SJIS:63647〜63919)を除いて表示したいのです。
>だれか、特定の文字コードの文字だけを取り除く方法をお教え願えないでしょうか?

とりあえずEZとは何の事だか分からないんですが、(^^;; ドコモの絵文字リストを見ると、
ずいぶん飛び飛びにコードが割り当てられているんですね。

コードの範囲は、

No.001 0xF89F (63647)
 .
 .
No.094 0xF8FC (63740)
No.095 0xF940 (63808)
 .
 .
No.104 0xF949 (63817)
No.105 0xF972 (63858)
 .
 .
No.117 0xF97E (63870)
No.118 0xF980 (63872)
 .
 .
No.134 0xF990 (63888)
No.135 0xF9B0 (63920)
No.136 0xF991 (63889)
 .
 .
No.166 0xF9AF (63919)

ですから、正規表現で書くと、

$re_emoji = '\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x72-\x7E\x80-\xB0]';

となりますね。

簡便にはこれらの文字が現われたら、ゲタ(〓)か何かに差し替えてしまえば良いので、

$str =~ s/$re_emoji/〓/g;	# 簡単な式

で出来ますが、これだと偶々隣り合った漢字の[2バイト目1バイト目]の並びが
絵文字に一致してしまうと、そこまで変換してしまいます。

例えば、

$str = "半角カナ(\xB6\xC5)やAlphabetが有っても"
     . "絵文字(\xF9\x75\xF8\xA2)は除けるけど、"
     . "需要とかも化けてしまうかも?";

と言う文字列が有ると、これが、

「半角カナ(カナ)やAlphabetが有っても絵文字(〓〓)は除けるけど、氏vとかも化けてしまうかも?」

の様になってしまいます。

perlのヴァージョン5を使っているなら、上の簡単な式の代わりに、

$re_ascii     = '[\x00-\x7F]';
$re_sjis_c    = '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';
$re_sjis_kana = '[\xA1-\xDF]';
$re_emoji     = '\xF8[\x9F-\xFC]|\xF9[\x40-\x49\x72-\x7E\x80-\xB0]';

$str =~ s/\G((?:$re_ascii|$re_sjis_c|$re_sjis_kana)*?)(?:$re_emoji)/$1〓/g;	# 複雑な式

とすれば、正しく、

「半角カナ(カナ)やAlphabetが有っても絵文字(〓〓)は除けるけど、需要とかも化けてしまうかも?」

となります。

# perl4だと、前回の一致位置のしっぽ(\G)も最短一致(*?)も無いので、
# ループを回さなくてはいけないでしょうから面倒そう。取りあえずperl4版はパスです。(^^;