2006年01月31日

ずいぶん古いネタですが、頼まれ事されたのでコード公開。

iアプリの仕様としては、内部のエンコードがUCS-2という形式になっています。
HTTP通信時にストリームをかますとSJIS←→UCS-2変換を行ってくれる仕組みがあるので
iモードコンテンツと同じノリで、iアプリ向けのサーバプログラムがかけます。
ただ、それ以外のエンコードの変換は行ってくれないのでサーバ側で吐き出すデータはSJISしか使えないのです。
もしくはUCS-2を直接吐き出して、生ストリームで読み書きするとか。

大昔にiアプリで動くBlogクライアントを書いたのですが、サーバ側のエンコードはUTF-8なのです。
iアプリの機能ではUTF-8←→UCS-2なんて事はやってくれません。

で、どうしたかと言うと。。。
生ストリームでHTTP通信をして、ループでまわしてUTF-8←→UCS-2変換するコードで処理する。
というありえない対処をしました。
大昔のASCII本に掲載されているRSSリーダのソースには、もっとJavaっぽくUTF-8←→UCS-2なストリームを実装してました。
というか、携帯でRSS!とか騒いでいる今日この頃ですが、大昔から実装はありましたよっと。

で、自作のだめだめUTF-8←→UCS-2変換処理を晒します。

UCS-2をUTF-8に変換しながらサーバに送信するコード

        int body_size = body.length();
http = (HttpConnection)Connector.open(url,Connector.READ_WRITE, true);

OutputStream dout = http.openOutputStream();
for (int i = 0;i < body_size;i++) {
int w_char = (int) body.charAt(i);
if (w_char < 256) {
dout.write((char) w_char);
} else {
int tmp;
tmp = ((w_char & (240 << 8)) >> 12) + 224;
dout.write((char) tmp);
tmp = ((w_char & (63 << 6)) >> 6) + 128;
dout.write((char) tmp);
tmp = (w_char & 63) + 128;
dout.write((char) tmp);
}
}
dout.flush();
dout.close();

UTF-8をUCS-2に変換しながらサーバのデータを受信するコード
      in = http.openInputStream();
din = new DataInputStream(in);
int w_char;
msg = new String();
while ((w_char = din.read()) != -1) {
if (w_char > 224) {
int w_1, w_2, w_3, w_4;
w_1 = ((w_char - 224) << 4);
w_char = din.read();
w_2 = ((w_char - 128) >> 2);
w_3 = ((w_char - 128) << 6);
w_char = din.read();
w_4 = (w_char - 128);
msg += (char) (((w_1 + w_2) * 256) + w_3 + w_4);
} else {
msg += (char) w_char;
}
}
後は略

といった感じで適当にビットシフトさせてます。
まともにJava書いたこと無いので駄目駄目ソースですが、何かにインスパイアしてもらえたら嬉しいです。

ちなみにライセンスは、この部ログにコメントすることでう。

Posted by Yappo at 2006年01月31日 13:48 | TrackBack | tech
Comments

なるほど~!
ありがとうございます!
早速使わせて頂きます。

Posted by: hiramax at 2006年02月01日 12:45
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。