メモ書き Java

2005/01/18
■URLEncoder

JDK1.3ではURLEncoderで文字コードを指定できない。
MacでもWinでもサーバに送る文字コードを統一したいため、自作してみた。
その前にいくつかテスト。

import java.net.*;

public class Test060118a {
    public static void main(String[] args) throws Exception  {
        String str = "あいうえお";
        byte[] b;

        b = str.getBytes("SJIS");
        for (int i=0; i<b.length; i++) {
            System.out.println(Integer.toHexString(b[i] & 0x000000FF));
        }
        System.out.println(URLEncoder.encode(new String(b)));

        b = str.getBytes("EUC_JP");
        for (int i=0; i<b.length; i++) {
            System.out.println(Integer.toHexString(b[i] & 0x000000FF));
        }
        System.out.println(URLEncoder.encode(new String(b)));

        b = str.getBytes("UTF-8");
        for (int i=0; i<b.length; i++) {
            System.out.println(Integer.toHexString(b[i] & 0x000000FF));
        }
        System.out.println(URLEncoder.encode(new String(b)));
        System.out.println(URLEncoder.encode(new String(b,"UTF8")));

    }
}

結果

82
a0
82
a2
82
a4
82
a6
82
a8
%82%A0%82%A2%82%A4%82%A6%82%A8
a4
a2
a4
a4
a4
a6
a4
a8
a4
aa
%A4%A2%A4%A4%A4%A6%A4%A8%A4%AA
e3
81
82
e3
81
84
e3
81
86
e3
81
88
e3
81
8a

%82%A0%82%A2%82%A4%82%A6%82%A8

バイト配列で文字コードの変更をして、UTF8にしたものはうまくURLエンコードできなかった。
まあ、一文字3バイトになってる時点でダメっぽいが。

このテストの結果、new String(b)としたときにプラットフォームのデフォルトエンコーディングで
byte[]からStringに変換されるようなので、Windows環境では結局、String(SJIS)→byte[](UTF8)→String(SJIS)
ということでしょうか?しかも2文字が3文字になってしまってそのあとにUTF8としてURLエンコード?
もうぐちゃぐちゃ。

public class Test060118b {
    public static void main(String[] args) {
        String str = "あいうえお";
        System.out.println(MyURLEncoder.encode(str, "UTF8"));
    }
}

final class MyURLEncoder {
    public static String encode(String str, String code) {
        byte[] bstr;
        StringBuffer sb = new StringBuffer();
        try {
            //デフォルト文字コードから code に変換
            bstr = str.getBytes(code);
        } catch(java.io.UnsupportedEncodingException ue) {
            return null;
        }
        for (int i=0; i<bstr.length; i++) {
            int c = bstr[i] & 0x000000FF;
            //1桁になってしまうものは"0"をつけて2桁に修正
            sb.append( ((c <= 0x0000000F) ? "%0" : "%") + Integer.toHexString(c) );
        }
        return sb.toString();
    }
}

結果
%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a