WEB相談室

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

タイトル:cgiによるかな検索

0:[投稿] おかめ [2002/07/24 18:30 ][環境:WIN+NN WIN系+Perl]

教えて下さい。
セレクトボックスから『まみむめも』行を選択して検索すると
連想配列の"title="から先頭文字が『まみむめも』のいづれかの場合に表示させるようにしたいのですが、同じデータなのにIEでは一致する件数が少ないんです。
『あ〜は』までは同じ一致件数なんですが、『ま〜わ』が一致しません。コードがEUCだからかな?とも思ったのですが確信がありません。
どんな原因があるのでしょうか?


1:[回答] おかめ [2002/07/24 18:32 ]

漏れてしまいましたがNNとIEで比べた時の違いです。
NNは4.7、IEは5です。
よろしくお願いします。


2:[回答] しなのむし [2002/07/24 18:58 ]

日本語のパターンマッチは
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
あたりが詳しいですが、上記でも
> スクリプトを EUC-JP で書き
> 漢字コードが EUC-JP である日本語を処理する
が前提ですからその辺をしっかりと確認されてはどうでしょうか?

そもそも
> セレクトボックスから『まみむめも』行を選択して検索すると
> 連想配列の"title="から先頭文字が『まみむめも』の
> いづれかの場合に表示させるようにしたい
は現在どのように実装しているのですか?

- どこからどこへどんな漢字コードのデータが渡るのか
- 漢字コードの変換はあるのか
- どのようにマッチさせているのか
等を書いてくれないとなんとも。。。


3:[回答] おかめ [2002/07/25 08:39 ]


現在スクリプトも検索データも全てEUCです。
また、検索対象は漢字ではなくふりがな(ひらがな)です。
マッチングは以下のように、ふりがなの先頭一文字を格納してそれが
例えば『まみむめも』に当てはまるかどうかを調べています。

$kanatop = substr($FIELD{'kana'},0,2);
if($kana =~ /$kanatop/){
    $SEARCH[5]="1";
}

コード変換

&ReadParse(*QUERY);
while(($key, $value) = each % QUERY){
    $key =~ /upload/i && next;
    $value =~ s/\n//g;    $value =~ s/</&lt;/g;    $value =~ s/>/&gt;/g;
    &jcode'convert(*value,'euc');
    $QUERY{$key} = $value;
}

現在上記の方法で、NNでは正しくマッチングできています。
IEだとマッチング件数が少ないです。
指摘していただいたページも見たのですが、こちらだと“IEとNNでの違い”については書かれていなかったので・・・


4:[回答] しなのむし [2002/07/25 12:57 ]

例の場合
$kana = 'まみむめも';
ということですか?

>セレクトボックスから『まみむめも』行を選択
フォームから渡ってくるどのようなデータを元に
『まみむめも』行が選択されたことを判別していますか?
"まみむめも"という文字列そのものですか?


5:[回答] おかめ [2002/07/25 13:49 ]

しなのむし様のご察しのとおり、
$kanaには'まみむめも'という文字列が入っています。
セレクトボックスで
<SELECT NAME="kana">
<option value=まみむめも>ま行
</SELECT>
のように、文字列を直接渡しています。


6:[回答] しなのむし [2002/07/25 14:52 ]

<option value="ma_gyou">ま行
等にしてスクリプト内部で
if($FORM{'kana'} eq 'ma_gyou')
{$kana = 'まみむめも';}
とやってみてははどうでしょうか。

ブラウザ依存で結果が違う理由は
><option value=まみむめも>ま行
しか考えられないので。


7:[完了] おかめ [2002/07/25 17:15 ]

できました!

しなのむし様の書いてくださったとおり、一度'ma'という
文字列をvalueに入れてスクリプト内でif文を追加したら、
まさにピッタリ希望どおりのデータが出てきました!
やはりvalueに全角文字をいれるのは無理があったみたいですね…(-_-;)
しなのむし様、助かりました!本当にありがとうございました<m(__)m>



8:[完了] TOM neko [2002/07/25 18:20 ]

>>7
>やはりvalueに全角文字をいれるのは無理があったみたいですね…(-_-;)

そんなことは無いはず。

<option value=まみむめも>→<option value="まみむめも">では?


9:[完了] おかめ [2002/07/26 09:02 ]

TOM neko様

すみません記述ミスです。
スクリプトにはダブルクォーテーションが入っています。
でもやはり件数が一致しないんです。
IEってEUCコードのソースをメモ帳などで表示すると
全角文字が半角文字とかの羅列になっちゃいますよね?
それが関連して全角文字がうまく認識できないのかと
初心者の浅知恵で思ってました。
とりあえずEUCコードのときは全角文字を避けようという結論に・・・。


10:[完了] TOM neko [2002/07/26 13:03 ]

確かに、全角文字のデータは化ける可能性があります。なので、判定の基準になる「まみむめも」を「ma_gyou」と書き換えたのは正解です。valueに入れないで済むなら入れない方がいいとは言えるかもしれません。

しかし、EUCの時にはいつでもvalueに入れない方がいいほど不確実だとすると、日本語のフォーム入力そのものが怪しくなり過ぎますから、「無理があった」に対して「そんなことは無いはず」と思うのです。

IEでEUCのソースを表示した時に化けるのは、メモ帳にEUCを表示する機能が無いからで、IEのせいではありません。EUC-JPで書かれたページでもHTMLの表示はちゃんとできてますから。IEもそこまで変じゃないです。

さて、ブラウザによる違いが出るって事は、送られるデータが違うからですが、考えられるのは、ブラウザによって個性が出そうな自動判別、の失敗によって、EUCで書かれたページをShift_JISで表示した状態でデータが送られた可能性くらいです。

下記の指定を日本語を使っている<title>よりも後に書くと、ページが正確に表示されない可能性が高くなりますね。
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">

単純にIEのバグかもしれませんが。

時間があれば色々実験したいところです。


11:[関連] しなのむし [2002/07/26 18:50 ]

参考:
http://www.ibport.co.jp/~yui/cgiwork/code/ (ちと古い)
http://tohoho.wakusei.ne.jp/wwwqa1.htm#InputDataKanjiCode
http://www.mikeneko.ne.jp/~lab/kcode/codequery/euc_jp.html

フォームのページといっても

- METAタグ(http-equiv="Content-Type")でcharsetを指定
- Response Headerでcharsetを指定
- なんの指定も無し

があるわけで、表示時点で文字化けが起こっているケースもありでしょう。
その辺までしっかり把握しながらの調査を希望。(って誰に)


12:[回答] TOM neko [2002/07/26 19:51 ]

ちと古いおかげさまで、hiddenとselectがSJISで、記入した項目がEUCだという、うわさのIE3のすごい実装が確認できました。

「まみむめも」が変になる問題は、2箇所で起こる可能性があると思います。

●1つ目は、ページ表示時点で文字化けが起こった場合。
ソースのデータをそのままURLエンコードして送るブラウザなら問題ありませんが、わざわざ他の文字セット(文字コード)に変換してからURLエンコードするブラウザだと、文字化けしたものをさらに変換するので、殆ど回復不可能に化けてしまうでしょう。

この場合、文字化けしなければいいのですから、metaタグでも応答ヘッダでも「入口」でも、とにかく正確な文字セットで表示させることができれば解決しそうです。

●2つ目は、jcode.plの判別の失敗。
文字化けしない場合、ブラウザによって送られてくる文字セットが違っていても、jcode.plの自動判別と変換が完璧なら問題は起こらないはずですね。value単位で行うと比較的文字数が少ないので、失敗は結構高い確率で起こります。jcode.plって、EUCのコードをさらにEUCに変換しようとすると失敗しやすいです。使えるなら、Jcode.pmの方が失敗しにくいようです。

こちらは、hiddenに判別の失敗しない「入口」等の文字を入れておいて、送られてくる文字セットを決めうちして変換する手があります。先のおそろしいIE3でなければ、だいたいうまくいきます。type="text"に入れておいてCSSで隠しておく、なんて思い付きましたが。

というわけで、上記2点をなんとかすれば、ほぼ正確にvalueの内容が受け取れると思います。確認希望。(って誰に)

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World