- ベストアンサー
Perlでのマッチング処理について
検索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で結果表示。 ※まだデバッグ途中なのですが、とりあえず今判明しているのは 『インターネット』などというふうに、『ー』がキーに入るとエラーになります。 どなたかよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
2バイトの文字を1バイトずつ処理する時にエラーが出るのですね。 方法としては#1の方のおっしゃる通り、EUCで扱うのが一番良いのではないでしょうか。 日本語ってやっかいです(^^; 文字コードについて詳しく載っているサイトを2つほどご紹介しておきますね。
その他の回答 (3)
- leaz024
- ベストアンサー率75% (398/526)
EUCへ変換、と書かれていますが、きちんと変換されていないのではないでしょうか。 シフトJISの「ー」の文字コードは「0x815B」となっていますが、この2バイト目のコード「0x5B」は「 [ 」の文字コードであり、これは正規表現のメタ文字です。 このためマッチングを行うと、正規表現が正しく書かれていないというエラーになります。 これを回避するためには、quotemeta関数を使います。 この関数を使用することで、メタ文字などは全てエスケープされます。 使い方は、次のような感じです。 $word = quotemeta($word); 普通、マッチングに使うデータは、この関数を通します。 ちなみに(8)の部分は、POSTデータと読込データが逆ではないですか? 通常は、 if (被検索文 =~ /検索語/) { となると思うのですが。
お礼
なるほど、quotemetaなんて関数があったのですね。素人ですみません。 皆様からのいろいろなアドバイスを受け、試行錯誤した結果、全ソース、 及びデータもEUCにすることで解決致しました。でもまだ試してはいないの ですが、quotemetaを使用したロジックでもうまくいきそうな気がします。 ご助言誠にありがとうございました。
- tfp
- ベストアンサー率37% (3/8)
大文字小文字の判別や正規表現である必要がなければ、(4)と(7)の処理をなくして、(8)をindex関数を使ったサーチにしてみてください。ほとんどの場合うまくいきますし、高速です。 以下、簡単なサンプルです。 ------------------------------------------------ $data = 'インターネットサービスプロバイダ'; $words = 'ー'; if (index($data, $words) > -1) { print '検索文字列「', $words, '」が見つかった'; } else { print '検索文字列「', $words, '」は見つからない'; }
お礼
う~ん、index関数も試してみました。ですが、なんだかうまくいかないんですよ~。レンタルサーバなので、なかなかデバッグ情報が得られなくって・・・。 結果、全てをEUCにすることで対処致しました。 貴重なご助言、本当にありがとうございました。
- Spur
- ベストアンサー率25% (453/1783)
EUCにしてください。
お礼
おっしゃる通りです。
お礼
参考URLで、私にとってBlackBoxであった文字コードについての理解が深まりました。ありがとうございます。確かにEUCで全て記述することによって、一発解決致しました。