- PR -

URLEncoder、URLDecoderの挙動について

1
投稿者投稿内容
どらねこ
常連さん
会議室デビュー日: 2004/01/05
投稿数: 25
投稿日時: 2005-11-01 12:03
リファラーURLのクエリー文字列を見て、検索キーワードを取得するプログラムを作成しているのですが、リファラーサイトのcharsetがShift_JISの場合、URLDecoderでdecodeがうまくいきませんでした。

例.www.excite.co.jpで"東京大学"を検索
取得したURL:http://www.excite.co.jp/search.gw?lk=excite_jp&lang=jp&c=web&target=combined&search=%93%8C%8B%9E%91%E5%8Aw
検索キーワード:%93%8C%8B%9E%91%E5%8Aw

検索キーワードをDecodeした結果
URLDecoder.decode("%93%8C%8B%9E%91%E5%8Aw","Shift_JIS") = 東京大?w
上記のとおり正しくDecodeできません。

さらに調査した結果、そもそもURLEncoderでencodeした場合の結果も異なっていました。
URLEncoder.encode("東京大学","Shift_JIS") = %93%8C%8B%9E%91%E5%8A%77

なぜこのような違いが出てしまうのでしょうか?
また、解決策をご存知でしたら教えていただけますか。

JDKのバージョンはJDK1.5.0_04です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-01 12:26
この問題かな?
http://dock.baykit.org/webut13?URLEncode

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-11-01 22:14
つばさです。

HTTPClientのクラスを使えば、解決可能かと思います。

理論については、
http://senrigan.ddo.jp/candid/urlencode.html
を参照されてください。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-11-02 23:30
つばさです。
すみません、HTTPClientのサンプルを提供しておりませんでした。

import org.apache.commons.httpclient.util.URIUtil;
System.out.println(URIUtil.decode("%93%8C%8B%9E%91%E5%8Aw", "Windows-31J"));
System.out.println(URIUtil.decode("%93%8C%8B%9E%91%E5%8A%77", "Windows-31J"));

いずれも東京大学になります。

以上です。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-11-03 16:55
つばさです。

HTTPClientでなくて、commons codecにエンコード、デコードのメソッドがありますね。

import org.apache.commons.codec.net.URLCodec;

URLCodec codec = new URLCodec();
System.out.println(codec.decode("%93%8C%8B%9E%91%E5%8Aw", "Windows-31J"));
System.out.println(codec.decode("%93%8C%8B%9E%91%E5%8A%77", "Windows-31J"));

以上です。
どらねこ
常連さん
会議室デビュー日: 2004/01/05
投稿数: 25
投稿日時: 2005-11-07 11:15
じゃんぬねっと様、つばさ様
返答ありがとうございました。

org.apache.commons.codec.net.URLCodec
を使用することにより、無事デコードすることができました。
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)