CGI-BBS > 基礎 > jcode/jcode.pl > フォームから受けた文字が化ける


カレッヂ
カレッヂ


質問者 jink  投稿日 9/19(水) 13:53:45
文字化けに関する情報をいくつか見たのですが、どれにも当てはまらない
文字化けをしているので質問させていただきます。プログラムはフォーム
から受け取った文字をデータファイルから検索するもので、CGIに送るのは
文字列1つだけです。

どのような文字化けをするかと言いますと、「音楽」と入力して検索すると
「音該」になってしまいデータファイル上の「音楽」を無視してしまいます。
「サウンド」と入力して検索すると「サウンォ」となり、部分的に文字化け
してしまいます。(アルファベットは大丈夫です)
漢字コードをEUCなどにするとまた別の文字になってしまいます。

以下のアドレスに検索部分のみを抜き出したサンプルがあります。
http://www1.vc-net.ne.jp/~jink/cgi-bin/search/search_test.cgi
プログラムは、こちらです。
http://www1.vc-net.ne.jp/~jink/cgi-bin/search/search_test.txt

分かる方いらっしゃいましたら、宜しくお願い致します。
回答者 あけび  [削除]  投稿日 9/19(水) 15:57:07
> $keyword = uc($keyword);
ここで、半角英字にあたるコードが
無条件に大文字のコードに変えられてしまうためです。
例えば、S-JIS全角カタカナの “ド”は
上位バイト0x83、下位バイト0x68ですが、下位バイトの0x68は
半角小文字の h とも同じ文字コードであるため、
ここが H の文字コードである0x48に変換されてしまい、
上位バイト0x83+下位バイト0x48 である“ォ”に変わってしまいます。
質問者 jink  [削除]  投稿日 9/19(水) 16:50:30
あけび様

早速、ご返答くださいまして有難うございます。
ご指摘いただきました箇所を削除したところ、ちゃんと表示されました。

ところが、当然と言えば当然なのですが大文字と小文字を区別してしまう
ため、「cd」と「CD」が別物になってしまいます。
この場合、受け取ったキーワードが「半角英数字」のみか「日本語」を
含むのかをチェックする必要がありますが、そういったことは可能なの
でしょうか。
文字数を返す関数とlength(バイト数)が同じなら半角のみ、違うなら
日本語含むといったことも考えてみたのですが、単純に文字数を返す
関数がないようで・・・

何か方法がございましたら、アドバイスお願いします。
回答者 あけび  [削除]  投稿日 9/19(水) 17:10:50
受け取るキーワードの文字コードがS-JISであるなら、
$keyword = uc($keyword);
の部分を
$keyword =~ s/(.)/\0$1/g;
$keyword =~ s/(\0[\x81-\x9f\xe0-\xfc])\0(.)/$1$2/g;
$keyword =~ s/\0([a-z])/\U$1/g;
$keyword =~ tr/\0//d;
とすることで、全角文字には影響を与えず
半角英小文字のみを大文字に変換できます。

あるいは、
&jcode'convert(*keyword,'euc');
$keyword = uc($keyword);
&jcode'convert(*keyword,'sjis');
のように一旦eucにしてからucを通し、
その後sjisに直しても同様の結果が得られると思います。
質問者 jink  [削除]  投稿日 9/19(水) 17:10:49
あけび様

早速、ご返答くださいまして有難うございます。
ご指摘いただきました箇所を削除したところ、ちゃんと表示されました。

ところが、当然と言えば当然なのですが大文字と小文字を区別してしまう
ため、「cd」と「CD」が別物になってしまうという問題が発生してしまい
ます。

投稿しようとしたら質問を終了しないといけないようなので、これに関し
ては他を探してみます。(また別の項目で質問してしまうかもしれません)

数日間、いろいろ漢字コード変えたり作り直したり、行き詰まっていたの
で助かりました。
有難うございました。

このページは終了したので返信(回答)は書きこめません

Web裏技