CGI-BBS > CGI > Perl > URLエンコードについて


カレッヂ
カレッヂ


質問者 ぴとりん  投稿日 3/6(火) 05:07:05
はじめまして。早速ですが、質問させて頂きます。

FORMに入力された文字(キーワード)を、URLエンコードしてメタ検索するプログラムを作成しました。いろいろテストをしてみたのですが、「OCNnavi」などのEUCで書かれた検索サイトでは、「車」というキーワードが「ヤ」に化けてしまいます。「車」以外のキーワードは正常にエンコードされるのにどうしてなんでしょう? 代表的なメタ検索の「EasySEARCH」http://www3.nibh.go.jp/EasySEARCH/でも同様の症状でした。これって、私のパソコンがオカシイのでしょうか? それともIE5のブラウザの問題なのでしょうか? ご指導よろしくお願い致します。

URLエンコード
$str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;


回答者 さくら  [削除]  投稿日 3/7(水) 01:15:51
解決策を示すものではありませんが、参考にして下さい。
PC や IE5 の問題では無いと思います。

まず、各検索エンジンがどのように文字コード変換とマッチ処理を行なっているかは
各プログラムによるので、特定してお話できませんが、文字コードについて書きます。

WIN や MAC を使っているユーザーが検索文字列を送信すると、
シフトJIS で送信されます。
それでは、例の 車 ですが、文字コードは下記のようになっています。

シフトJIS    8ED4    車
EUC          BCD6    車

それでは、EUC の 8ED4 はどうなっているかというと、
半角カタカナの ヤ です。(ここでは、全角で入力しました。)

シフトJIS の 半角カタカナの ヤ は D4 です。

以上のようになっています。そして、シフトJIS と EUC のコードは、
重なっている部分がかなりあります。
さらに、送信情報が少なく、文字コードが重なっている場合、まさに今回の例がそれです。
8ED4 はシフトJIS の 車 かEUCの半角カタカナの や か判定できない状態になります。

そこで、EUCでマッチ処理をしている場合を考えて見ましょう。
送信された情報をEUCに変換しようとしますが、元の文字コードが判別できずに、
変換できなかったら、マッチはEUCで行ないますので、半角カタカナの ヤ にマッチします。

表示用にEUCを使う場合は 8ED4 のままなので、半角カタカナの ヤ が表示されます。
表示用にシフトJISを使う場合は、8E が取り除かれて D4 になります。
結局、半角カタカナの ヤ が表示されます。

また、文字化けしていても、半角カタカナの シヨ と表示される場合は、
データは、正しく変換されています。ただ、表示が正しくないだけですので、
ブラウザの 表示->エンコード->日本語(自動判別) で正しく表示されるはずです。

これは、情報を正しくEUCに変換できれば、BCD6 に変換されています。
これをシフトJISで表示すると、
BC  は半角カタカナの シ
D6  は半角カタカナの ヨ
このように表示されてしまいます。

長々と書いてしまいましたが、このようになっていますので、
送信情報の文字コードを確実に判定できる文字を一緒に送るか、
又は、判定できるであろう情報量を送信すれば良いという事になります。


質問者 ぴとりん  [削除]  投稿日 3/7(水) 07:02:07
おお、さくらさん有難うございます!
丁寧な解説で判りやすかったです。

いままで、jcode.plにて、
&jcode'convert(*word,'euc');を
&jcode'convert(*word,'euc','sjis');
としなければいけなかったのですね。

これで謎が全て解けました。
本当に有難うございます。
それにしても、日本語の扱いって面倒っすね。

よろしければ、私のサイトをご覧下さい。
http://www2.jcss.ne.jp/~medama/
とってもヘビーなサイトですが...

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

Web裏技