- PR -

URLDecoder

1
投稿者投稿内容
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2004-01-01 00:27
お世話になります。

Java の URLDecoder を使おうと思ったのですが、
J2sdk の 1.3(1.3.1_09) と 1.4(1.4.1_01)で動作が異なり
戸惑っています。

例えば %83e%83X%83g を 1.3 の URLDecoder を使うと
「テスト」とデコードしてくれますが、1.4 を使うと
「eXg」となってしまいます。
どうやら、1.4 になって %83%65 の文字列を %83e と
エンコードしまうとうまくデコードしてくれなくなった
ようなのです。

ちなみに、Google などで Shift_JIS を指定して「テスト」を
検索した場合には、「%83e%83X%83g」にエンコードされている
ため、上記エンコード結果があながち間違いとも言えなのか?
とも思ってしまいます。

正確なところどうなのでしょうか?
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-01-01 05:01
J2SE 1.3 と 1.4 の API ドキュメントを見比べてみました。
1.3 では 1 引数のメソッドしかありませんが、これは 1.4 で deprecated になっており、2 引数でエンコーディングを明示するメソッドが追加され、こちらの利用が推奨されています。

結論としてデコード結果の違いはデフォルトエンコーディングによるものと考えられますが、http://www.gimlay.org/~javafaq/S146.html によると、1.2 以降では実行時にデフォルトエンコーディングを変更する方法がないようです。(つまりプラットフォームのみで決まってしまう)

一つのソースで違いを綺麗に吸収する方法については、今のところ考えがありません
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2004-01-01 12:34
Gio さんご指摘のとおり、1.4 からエンコーディングを指定する
ようになりましたが、MS932, Windows-31J, Shift_JIS の
いずれを指定してもうまくデコードされませんでした。

Input : %83e%83X%83g
Result[MS932] : eXg
Result[Shift_JIS] : ?e?X?g
Result[Windows-31J] : eXg

また、エンコーディングを指定しない従来のメソッド(Deprecated)
も試してみましたが、やっぱり駄目でした。
Input に "%83%65%83%58%83%67" を指定した場合には、全て正常に
「テスト」とデコードされます。
もしかして、1.4 のバグ?

ちなみに OS は Windows2000 です。


[ メッセージ編集済み 編集者: ボア 編集日時 2004-01-01 12:36 ]
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-01-01 15:52
URLEncoder.encode メソッドで「テスト」をエンコードしてみると、デフォルトエンコーディング、MS932, Shift_JIS. Windows-31J のすべてで結果は %83%65%83%58%83%67 になりました。
ちなみにこちらの環境は Windows XP Professional SP1 で、JDK 1.4.2_03 です。

URLEncoder の API ドキュメントから HTML の仕様:
http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
を辿ったところ、英数字と一部の記号以外の文字(原文 non-alphanumeric characters)は %xx という形式に変換されるとありました。

私の考えですが、1.3 ではこの変換がバイト単位で適用されていた(「テ」0x8365→0x83,0x65→%83e; 英数字の範囲にある 0x65 は無変換)のが、1.4 では多バイトコード文字の場合にも文字単位で適用されるように仕様が変わったのだと思います。
バグは言い過ぎでしょう

ちなみに、URLEncoder.encode(String, String) メソッドの仕様にも、UTF-8 以外のエンコーディングを使用した場合の互換性は保証しないとあります。
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2004-01-01 18:07
まぁバグは冗談ですが、URL エンコードの仕様上も「テ」を
%83%65 にすることが本来正しいのだとは思います。

が、少なくとも Win2K 上の IE6 や NN7 などで、「テスト」
を GET でリクエストすると、%83e%83X%83g になるし、
.NET の HttpUtility.UrlEncode メソッドで Shift-JIS エンコード
するとやっぱり %83e%83X%83g になりますね。
UTF-8 でエンコードすれば上記のように半角英数に再変換される
ようなバイト列にはならない感じです。

1.4 で上記をデコードできないように仕様を変えたのは、
「UTF-8 を使いなさい」ということとMSへの対抗でしょうか。。。(笑)
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-01-01 20:15
そうですね。HTML 仕様準拠ということでは、私も 1.4 の仕様が本来の形だと思います。
引用:

1.4 で上記をデコードできないように仕様を変えたのは、
「UTF-8 を使いなさい」ということとMSへの対抗でしょうか。。。(笑)


←初笑い
1

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