プロが教える店舗&オフィスのセキュリティ対策術

検索CGIを作成しているのですが、検索文字に「ー」(-ハイフンではありません。日本語入力の言葉を伸ばすやつです。”サーバ”とか。)が入った文字を指定し、POSTするとServerErrorになってしまいます。サーバはレンタルものなので原因が分からず途方にくれています。どなたかPerlに詳しい方、ぜひよいアドバイスを下さい。ちなみに処理は下記のように行っています。

(1)検索する元のデータはsjisである。
 ↓
(2)ブラウザのフォームから、検索したいデータがsjisでPOSTされる。
 ↓
(3)ReadParseにてデータを変数へ取り込む。(cgi-lib.pl使用)
 ↓
(4)CGIにて、POSTされたデータをeucへ変換。(jcode.pl使用)
 ↓
(5)検索する元のデータが入ったファイルをオープン。
 ↓
(6)ファイルから1行づつ読み込み変数へ格納。
 ↓
(7)変数へ格納したデータをeucへ変換。
 ↓
(8)if (${POSTされたデータ} =~ /${ファイルから読み込んだデータ}/)といった形でマッチング処理
 ↓
(9)ファイルをクローズし、マッチングしたデータをsjisで結果表示。

※まだデバッグ途中なのですが、とりあえず今判明しているのは
『インターネット』などというふうに、『ー』がキーに入るとエラーになります。

どなたかよろしくお願いします。

A 回答 (4件)

2バイトの文字を1バイトずつ処理する時にエラーが出るのですね。


方法としては#1の方のおっしゃる通り、EUCで扱うのが一番良いのではないでしょうか。
日本語ってやっかいです(^^;
文字コードについて詳しく載っているサイトを2つほどご紹介しておきますね。

参考URL:http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/f …
    • good
    • 0
この回答へのお礼

参考URLで、私にとってBlackBoxであった文字コードについての理解が深まりました。ありがとうございます。確かにEUCで全て記述することによって、一発解決致しました。

お礼日時:2002/04/27 13:59

EUCへ変換、と書かれていますが、きちんと変換されていないのではないでしょうか。


シフトJISの「ー」の文字コードは「0x815B」となっていますが、この2バイト目のコード「0x5B」は「 [ 」の文字コードであり、これは正規表現のメタ文字です。
このためマッチングを行うと、正規表現が正しく書かれていないというエラーになります。

これを回避するためには、quotemeta関数を使います。
この関数を使用することで、メタ文字などは全てエスケープされます。
使い方は、次のような感じです。
  $word = quotemeta($word);
普通、マッチングに使うデータは、この関数を通します。

ちなみに(8)の部分は、POSTデータと読込データが逆ではないですか?
通常は、
  if (被検索文 =~ /検索語/) {
となると思うのですが。
    • good
    • 0
この回答へのお礼

なるほど、quotemetaなんて関数があったのですね。素人ですみません。
皆様からのいろいろなアドバイスを受け、試行錯誤した結果、全ソース、
及びデータもEUCにすることで解決致しました。でもまだ試してはいないの
ですが、quotemetaを使用したロジックでもうまくいきそうな気がします。
ご助言誠にありがとうございました。

お礼日時:2002/04/27 13:51

大文字小文字の判別や正規表現である必要がなければ、(4)と(7)の処理をなくして、(8)をindex関数を使ったサーチにしてみてください。

ほとんどの場合うまくいきますし、高速です。

以下、簡単なサンプルです。
------------------------------------------------
$data = 'インターネットサービスプロバイダ';
$words = 'ー';

if (index($data, $words) > -1) {
print '検索文字列「', $words, '」が見つかった';
} else {
print '検索文字列「', $words, '」は見つからない';
}
    • good
    • 0
この回答へのお礼

う~ん、index関数も試してみました。ですが、なんだかうまくいかないんですよ~。レンタルサーバなので、なかなかデバッグ情報が得られなくって・・・。
結果、全てをEUCにすることで対処致しました。
貴重なご助言、本当にありがとうございました。

お礼日時:2002/04/27 13:56

EUCにしてください。

    • good
    • 0
この回答へのお礼

おっしゃる通りです。

お礼日時:2002/04/27 14:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!