- 締切済み
perlで正常に検索できない
CGI RESCUE さんの 簡易データベースでdatファイルを検索しようとしています。。 http://www.rescue.ne.jp/cgi/database/ キーワードで検索をしようとしているのですが、うまくヒットしません。 CGIは以下のようになっています。 # キーワード(フリーワード) if ($FORM{'keyword'} ne '') { if ($com5 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; } elsif ($com4 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; } else { next; } } $com5には「スズキ用<br>ドアトリム<br>バックミラー」と入っていたとします。 「スズキ」または「ドア」・「ドアトリム」・「トリム」と入力すると、ヒットします。 「バック」または「バックミラー」で検索するとヒットしません。 改行が悪いのかと思い、 $com5を「スズキ用ドアトリムバックミラー」に修正してみました。 同じように「スズキ」等はヒットするのですが、「バック」または「バックミラー」で検索するとヒットしません。 「バックミラー」と言う語句がヒットしないのかと思ったのですが・・・ $com5を「バックミラードアトリムスズキ用」に修正したとします。 「バック」・「バックミラー」でヒットします。 また、「ドア」・「トリム」まではヒットしますが、「スズキ」・「スズキ用」になるとヒットしなくなります。 全くヒットしなかったり、動作しないわけではないので、そもそもが間違っているとかではなく検索する部分で何か文字数制限があるような感じですが、これはどこを修正したら良いでしょうか? 他に情報を記入しないといけない物があれば指摘お願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- pringlez
- ベストアンサー率36% (598/1630)
>これをutf-8用に改造できないでしょうか? >(私自身は方法が全然わからないので、修正個所・記述をそのまま教えていただけるとありがたいです) 改造は可能でしょう。ただし自己責任で行うべきです。 自分では方法はわからないという人は絶対にやるべきではありません。 使用しているスクリプトで元から想定している文字エンコーディングで使用するのが一番の解決方法です。 しかしそうではなく、自分の好きな文字エンコーディングを使用したい、機能についても元のものと似ていなければならないなどというのであれば、開発会社に依頼し作成してもらうのがいいでしょう。無料でできる範囲には限りがあるのは当然です。条件をいろいろつけるのであれば有料になるのは当たり前だと考えられるようにならなければならないと思います。
- pringlez
- ベストアンサー率36% (598/1630)
>検索フォームページ・プログラム・DATファイル共にUTF-8で保存してます。 そうですか。それが原因の可能性が高いと思います。 CGI RESCUE チャレンジCGI - 改行コード/漢字コードについて http://www.rescue.ne.jp/cgi/crlf/ このページには # 当サイトのスクリプトは、特に指定が無い限り、 SJISで作成しており、 # SJISのまま設置することで動作するように設計しています。 と書いてあるので、ファイルをSJISに変換して試してみてください。ただ、上記の正規表現を見るとEUCっぽく見えるんですよね。なので、SJISにしてだめならEUCにしてみてください。 SJISかEUCのどちらかならかでなら正しく動くと思います。それでダメなら別のもう少しつくりのいいスクリプトを探した方がいいでしょう。またもしも何が何でもUTF-8を使いたいというのであれば、UTF-8 に対応しているものを探した方がいいでしょう。
- pringlez
- ベストアンサー率36% (598/1630)
ファイルの文字エンコーディングは何ですか? EUC-JPになっていますか?
補足
返答ありがとうございます。 検索フォームページ・プログラム・DATファイル共にUTF-8で保存してます。 ただ、プログラムには「&jcode'convert(*value,'euc');」の記述がありますね… もしかしてこれが原因でしょうか? もしそうだった場合、どのように書き換えたらよいでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
・外部からデータを取り込むときに Encode::decode で外部表現から内部コードに変換する ・処理自体はすべて内部コードで行う ・外部にデータを渡すときに Encode::encode で内部コードから外部表現に戻す というように記述する.
- Tacosan
- ベストアンサー率23% (3656/15482)
入出力以外は全て内部コードで処理するように書き換える.
補足
返答ありがとうございます。 どのように記入したら良いのか教えていただけないでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
よほど古くっさい Perl でない限り, こんなわけのわからない正規表現を使うのはアホだと思う.
補足
返答ありがとうございます。 ではどのように書き換えたらよいのでしょうか? よろしくお願いします。
補足
返答ありがとうございます。 今までずっとSJISを利用していたんですけど、文字化けの問題などで全体をutf-8に変えました。 なので、この部分も出来ればutf-8を利用したいです。 これをutf-8用に改造できないでしょうか? (私自身は方法が全然わからないので、修正個所・記述をそのまま教えていただけるとありがたいです) もし不可能な場合、utf-8に対応している別のものを利用したいと思うのですが、似た様なものがどこかで配布されていないでしょうか?