![]() |
カレッヂ |
質問者 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裏技 |