新規記事投稿
フォロー記事投稿
記事のキャンセル
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版はパスです。(^^;