WEB相談室

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

タイトル:URLエンコードについて

0:[投稿] だっくすふんど [2003/03/06 20:34 ][環境:IE5 FreeBSD Apache,CGI,perl ]

ある文字列をいろいろな検索サイトで検索するためのリンクを
作成したのですが、一部のサイトで文字化けが起こってしまいます。

エンコードで使用しているスクリプトは

sub url_encode($)
{
 $before = shift ;

 $after =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
 $after =~ s/\s/+/g;

 return($after) ;
}

というもので、例えば ’あいうえお’という文字列をエンコードさせると
%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA
となります。

ここで

http://search.yahoo.co.jp/bin/search?p=%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA

とすると、正常にページが表示されます。

しかし、GoogleとAlltheWebでエンコードした文字列を組み合わせて検索しても文字化けしてしまいます。

調べてみるとYahooやInfoseekは ’あいうえお’を

%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA

とエンコードしていて
GoogleとAlltheWebは

%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

とエンコードしています。

どうやら、YahooやInfoseekはEUCのエンコードで
GoogleとAlltheWebはSJISのエンコードらしいということまで
わかったのですが、EUCの文字列をSJISに変更してエンコード
するにはどのようにすればよいのでしょうか?

試しにこのようにしてみましたが、うまくいきません。

 $word='あいうえお';
 &jcode'convert(*word_s,'sjis');

 $word = url_encode($word);

良い方法を教えてください。よろしくお願いします。



1:[質問] だっくすふんど [2003/03/06 20:36 ]

訂正です。

sub url_encode($)
{
 $before = shift ;
 $after = $befor;  ←これが抜けていました

 $after =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
 $after =~ s/\s/+/g;

 return($after) ;
}


2:[回答] ひじ [2003/03/06 21:22 ]

>>0
>どうやら、YahooやInfoseekはEUCのエンコードで
>GoogleとAlltheWebはSJISのエンコードらしいということまで
そうではありません。
%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA (Yahoo, Infoseek) はEUC-JPで、
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A は UTF-8 です。
UTF-8はjcode.plでは他の文字符号化方式にすることができないので、 Jcode.pm を
使う必要があります。
http://openlab.ring.gr.jp/Jcode/index-j.html


3:[質問] だっくすふんど [2003/03/06 22:44 ]

ひじさんご回答ありがとうございます。

Jcode.pmをインストールして、実行してみました。

 $word_euc='あいうえお';
 $word_utf='あいうえお';

 &Jcode'convert(*word_utf,'UTF-8');

 $word_euc = url_encode($word_euc);
 $word_utf = url_encode($word_utf);

 print "$word_euc";
 print "$word_utf";

としてみたのですが、エンコード結果がどちらもいっしょになってしまいます。
やり方が悪いのでしょうか?


4:[回答] B-Cus [2003/03/07 02:35 ]

google は ie=EUC-JP などとすれば query のエンコーディングを
指定できたりします。

http://www.google.com/search?ie=UTF-8&q=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
http://www.google.com/search?ie=EUC-JP&q=%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA

ただし google にしか効きませんので、一般解としては自前で
エンコーディングを変換、ですね。


> &Jcode'convert(*word_utf,'UTF-8');

 Jcode'convert(*word_utf, 'utf8');

では? もちっと perl5 っぽく書くと

 Jcode::convert(\$word_utf, 'utf8');

あるいは

 $word_utf = Jcode->new($word_euc)->utf8;


Jcode.pm は使ったことないので、違ってたら失礼。


5:[完了] だっくすふんど [2003/03/07 13:18 ]

B-Cusさんご回答ありがとうございます。

教えて頂いたように
 Jcode::convert(\$word_utf, 'utf8');
を試したところUTF-8でエンコードできました。

補足:$word_utf = Jcode->new($word_euc)->utf8;
   だと、UTF8に変換されませんでした。

また、URLにてie=EUC-JPとする方法もOKでした。勉強になります。
同じようにAllthewebにて
cs=utf-8 の部分を cs=euc-jp に変えることで、EUC-JPでエンコードしたものが文字化けすることなく、使用できました。

ありがとうございます!

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World