検索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で結果表示。
※まだデバッグ途中なのですが、とりあえず今判明しているのは
『インターネット』などというふうに、『ー』がキーに入るとエラーになります。
どなたかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
2バイトの文字を1バイトずつ処理する時にエラーが出るのですね。
方法としては#1の方のおっしゃる通り、EUCで扱うのが一番良いのではないでしょうか。
日本語ってやっかいです(^^;
文字コードについて詳しく載っているサイトを2つほどご紹介しておきますね。
参考URL:http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/f …
参考URLで、私にとってBlackBoxであった文字コードについての理解が深まりました。ありがとうございます。確かにEUCで全て記述することによって、一発解決致しました。
No.4
- 回答日時:
EUCへ変換、と書かれていますが、きちんと変換されていないのではないでしょうか。
シフトJISの「ー」の文字コードは「0x815B」となっていますが、この2バイト目のコード「0x5B」は「 [ 」の文字コードであり、これは正規表現のメタ文字です。
このためマッチングを行うと、正規表現が正しく書かれていないというエラーになります。
これを回避するためには、quotemeta関数を使います。
この関数を使用することで、メタ文字などは全てエスケープされます。
使い方は、次のような感じです。
$word = quotemeta($word);
普通、マッチングに使うデータは、この関数を通します。
ちなみに(8)の部分は、POSTデータと読込データが逆ではないですか?
通常は、
if (被検索文 =~ /検索語/) {
となると思うのですが。
なるほど、quotemetaなんて関数があったのですね。素人ですみません。
皆様からのいろいろなアドバイスを受け、試行錯誤した結果、全ソース、
及びデータもEUCにすることで解決致しました。でもまだ試してはいないの
ですが、quotemetaを使用したロジックでもうまくいきそうな気がします。
ご助言誠にありがとうございました。
No.3
- 回答日時:
大文字小文字の判別や正規表現である必要がなければ、(4)と(7)の処理をなくして、(8)をindex関数を使ったサーチにしてみてください。
ほとんどの場合うまくいきますし、高速です。以下、簡単なサンプルです。
------------------------------------------------
$data = 'インターネットサービスプロバイダ';
$words = 'ー';
if (index($data, $words) > -1) {
print '検索文字列「', $words, '」が見つかった';
} else {
print '検索文字列「', $words, '」は見つからない';
}
う~ん、index関数も試してみました。ですが、なんだかうまくいかないんですよ~。レンタルサーバなので、なかなかデバッグ情報が得られなくって・・・。
結果、全てをEUCにすることで対処致しました。
貴重なご助言、本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 法人税 電子帳簿保存法について 1 2022/04/07 11:17
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
unicodeの表示
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
Excel VBAでPDFファイルをMicro...
-
Accessで日付や数値を全角で表...
-
データにカンマが入ったCSVデー...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
エクセルで数値を全角文字(カ...
-
CString Format にて全角空白文...
-
住宅にカナを入力する際に丁目...
-
VBA EXCEL あるセルの中の一...
-
csvデータのダブルクォーテーシ...
-
正規表現で、特定の文字列を含...
-
各項目がダブルクォーテーショ...
-
ハングルを日本語に置換
-
Accessのテキストボックスの入...
-
ウイザードからのVBAでクエリー...
-
テキストボックスの文字列を置...
-
Excel VBA 教えてください。 VB...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
ダブルクォート文字などをフォ...
-
正規表現でカンマを対象にする方法
-
文字実体参照が勝手に変換され...
-
常用漢字?でない文字を判定す...
-
文字化けを元に戻せますか?
-
戻り値の意味がわかりません…
-
チェックボックスの複数選択の...
-
「数値文字参照への変換するソ...
-
jcode.plについて
-
SUBMIT時の入力文字のURLエンコ...
-
半角カナを検出したい
-
utf-8のマシンでsjisのデータフ...
-
jcode.plのバグでしょうか?KCc...
-
Jcode.pmでの半角カナ→全角カナ...
-
文字をISO Lathin 1 文字コード...
-
機種依存文字の文字コード変換
-
パターンマッチ変換について
-
文字コード
-
index関数と英語文字
おすすめ情報