WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:投稿記事の絵文字を置換したい

0:[投稿] toor [MAIL] [2004/04/04 17:47 ][環境:IE6,WIN2K CGI perl.]

困ったことがあるのですが、アドバイスいただけないでしょうか。。

最近のau機種も絵文字をウェブ上に書き込めるようになったので、
auの絵文字コードを全て把握してみたところ、
Shift_JISコード2バイトの、
[\xF3][\x40-7E\x80-\xFC]
[\xF4][\x40-7E\x80-\x8D]
[\xF6][\x40-7E\x80-\xFC]
[\xF7][\x40-7E\x80-\xFC]
に格納されていることまで確認しました。
この全種類の絵文字コードを別々の文字列に置換したいのですが、
うまくゆきません。

文字列の先頭から1文字ずつ判定していく方法を考えているのですが、

# 置換リスト
@e_list = (\xF3\x80<>421<>,
          \xF7\xB2<>051<>);

# 永久にループ
while(1){
   # $msgの先頭に絵文字があった場合、置換して$newに追加
   if($msg =~ s/^([\xF3\xF4\xF6\xF7][\x40-\xFC])+//){
         
         # 絵文字コードをリストから探す
         foreach $data (@e_list){
             
             # リストを分割する
             @emoji = split(/<>/, $data);
             
             # リスト内のコードと一致したら置換する値を$newに追加
             if($emoji[0] eq $&){$new .= $emoji[1];}
         }
         
   # 先頭がSHIFT_JISの2バイト文字だった場合、切り取る
   } elsif ($msg =~ s/^([\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC])+//){
         
         # $newに追加
         $new .= "$&";
         
   # 先頭が1バイト文字だった場合、切り取る
   } elsif ($msg =~ s/^.//) {
       
         # $newに追加
         $new .= $&;
         
   } else {
         # $msg がなくなったのでループを抜けます
         last;
   }
}
  $msg = $new;

# このスクリプトはおがちょ様のhttp://www.specters.net/cgipon/
# i-mode絵文字処理を応用させていただいたものです。

これで$msgに絵文字コードを数字に置換した結果が格納されると思ったのですが、
500エラーがでたり、何も格納されなかったりと困っています。
今、掲示板を作成中で、焦っています。
とても難しい話になったかもしれませんが、どなたかお力を貸していただけないでしょうか?
宜しくお願いします。


1:[回答] みかん [2004/04/04 23:42 ]

> if($emoji[0] eq $&){$new .= $emoji[1];}

> $new .= $&;

パールはあまり詳しくないのですが、これは正しいのですか?

eq ってのは文字列の比較ですよね??

.= って文字列の連結ですよね??


2:[回答] toor [2004/04/05 00:07 ]

>みかんさん

みかんさんの仰るとおりです。
"eq"は文字列比較で".="は文字列の連結です。

$msgを先頭から1文字ずつ抜き出して、絵文字なのか、文字なのかを
判別して、
その1文字を$newに積み上げていくという概念です。

僕も $& に疑問をもっているのですが、参考ページに書いてあるとおりでしたので、
私は正規表現でマッチした文字列が格納されると思い込んでいるのですが。。

$&というのは間違った表現なのでしょうか?


3:[関連] Iwa [URL] [2004/04/05 03:28 ]

$&は正規表現とマッチした部分の文字列を保持している特殊変数のうちのひとつです。


5:[回答] toor [2004/04/05 16:25 ]

>Iwaさん
そうなのですか☆
何がまずかったのでしょう・・
とりあえず練ってみます。


6:[回答] 古のもの [2004/04/05 23:43 ]

> @e_list = (\xF3\x80<>421<>,
>          \xF7\xB2<>051<>);

ペーストミスでなく本当に元のソースがこういう記述なら、
文法エラーで動かないだろうなぁ。

> 500エラーがでたり、何も格納されなかったりと困っています。

当然文法エラーじゃ 500 にもなるわな。

こういう CGI とは直接関係無いロジックの検証は
ちゃんとローカルマシンに perl 入れてデバッグした方がいいと思うぞ。


とりあえずループの中で毎回 foreach + split するのも激しく無駄だし、
こんな感じでハッシュにした方がいいんじゃないかな。

%conv = ( "\x87\x40" => '(1)', "\x87\x41" => '(2)', "\x87\x42" => '(3)',
"\x87\x49" => '(10)' ); # 丸付き数字変換テーブル

if ($msg =~ s/^([\x87][\x40-\x49])//) {
    $new .= $conv{$&};
}


6:[保留] toor [2004/04/26 01:12 ]

古のものさん、回答いただいたのに
お返事できずに申し訳ありません。。

> %conv = ( "\x87\x40" => '(1)', "\x87\x41" => '(2)', "\x87\x42" => '(3)',
> "\x87\x49" => '(10)' ); # 丸付き数字変換テーブル
>
> if ($msg =~ s/^([\x87][\x40-\x49])//) {
>     $new .= $conv{$&};
> }

このソースを参考に明日、
ローカルで試行錯誤してみたいと思います。
その後、また報告させていただきますm(_ _)m


7:[回答] toor [2004/04/26 15:41 ]

%conv = ( "\x87\x40" => '(1)');

if ($msg =~ s/^([\x87][\x40-\x49])//) {
  $new .= $conv{$&};
}

こう書いた場合、$conv{$&}を認識してくれないせいか、
マッチした文字列は削除されるだけで終了してしまうようです。
どうしたものでしょう…。


8:[完了] toor [2004/04/26 18:26 ]

ハッシュのキーと正規表現でマッチした絵文字コードを10進に変換することで
解決しました。

また、上のソースでは2文字目以降の絵文字を認識しなかったので、
正規表現の()と+を除去することで解決しました。

ご迷惑をおかけしましたm(_ _)m

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World