- PR -

ビット列を文字ストリームに変換する

1
投稿者投稿内容
いしこ
会議室デビュー日: 2007/02/07
投稿数: 2
投稿日時: 2007-02-07 21:10
こんにちは。
現在、ビット列を文字ストリームに変換し、Shift-JISでファイルに書き込むプログラムを組んでいます。
ところが、例えばShift-JISでは「ぐ」となるはずの「1000 0010 1010 1110(0x82AE)」というビット列を出力すると「?」となってしまうように、文字が正しく表記されません。
文字ストリームについて詳しい方がいらっしゃれば、是非文字ストリームの変換について御教授願います。

プログラムは下記のように組みました。


import java.io.*;

public class ShiftJIS {
public static void main(String[] args) throws Exception{
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("result.txt"),"EUC-JP"));//"Shift-JIS"));
int data[] = {
1,0,0,0,0,0,1,0,//0x82
1,0,1,0,1,1,1,0//0xAE
};
int ss = 0;
for(int i=0;i<16; i++){
ss = ss<<1 | data[i];
}

ss = ss & 0xffff;
         out.write(ss);
}

}
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-02-07 21:53
Javaのcharの内部表現はUCS-2でShift_JISではありません。
0x82AEではなく0x3050にすればEUC-JPの「ぐ」が出ます。

#他にバグが無ければ。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-02-07 21:56
こんばんは

Javaは触らないので推測なのですが
ssがint型(32bits)だからとかではないでしょうか?
出力されたファイルをバイナリエディタで見た結果はどのようになっていますか?

Javaはビッグエンディアンと聴いた記憶があるので多分コードに問題がなければ
0x00 0x00 0x82 0xae などと出力されているんじゃないかと
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-02-07 22:54
Shift_JISのデータをShift_JISのまま出力したいなら、Writer系を使ってはダメです。Writer系はどうしてもUnicodeを経由しないといけないので。

コード:
OutputStream out = new FileOutputStream("result.txt");
// ss の作成は同じ
out.write(ss >> 8 );
out.write(ss & 0xff);



これでOKだと思います。
いしこ
会議室デビュー日: 2007/02/07
投稿数: 2
投稿日時: 2007-02-11 22:02
あしゅさん、未記入の方、スフレさん、お早い御返答をありがとうございました。
また、お返事が遅れてしまい、申し訳ありません。
アドバイスいただいたプログラムの結果を報告したいのですが、体調を崩しており、もうしばらくパソコンに触れそうにありません。
しかし、体調が回復次第かならずご報告いたします。
本当にありがとうございました。
1

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