|
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
|