- 締切済み
文字コードを読み込み、文字として出力したい
はじめまして、よろしくお願いします。 ファイルに書かれた文字コードをJavaで読み込み、その文字コードに対応する文字を別のファイルに出力するプログラムの書き方を教えてください。 例えば"00a7"と書かれたファイルを読み込み、別ファイルに"ア"として表示させたいのです。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- ssr-y6
- ベストアンサー率71% (5/7)
シフトJISコードで小さいカタカナのァは2バイトの0x007Aではなく1バイトの0xA7です。 よって入力データの上位バイトが0の場合は下位バイトのみを書きこむようにすればよいと思います。 以下がそのサンプルです。 import java.io.*; public class charcode { public static void main(String args[]) { String s1[], s2[] = {"00a7", "00a8", "00a9", "00aa", "00ab", "82a0", "82a2", "82a4", "82a6", "82a8"}; int d[], i; try { s1 = args[0].split(","); d = new int[s1.length]; for (i = 0; i < s1.length; i ++) d[i] = Integer.parseInt(s1[i], 16); } catch (Exception e) { d = new int[s2.length]; for (i = 0; i < s2.length; i ++) d[i] = Integer.parseInt(s2[i], 16); }; try { FileOutputStream FOS = new FileOutputStream("test.txt"); for (i = 0; i < d.length; i ++) { if (d[i] < 0x100) FOS.write(d[i]); else { FOS.write((d[i] & 0xFF00) / 0x100); FOS.write(d[i] & 0xFF); }; }; FOS.close(); } catch (Exception e) { System.out.println(e.toString()); }; }; }
うまくいってないという根拠は何ですか? 理想の結果と、現状を示して下さい。
lowerとupperの値は何が入ってますか? Stringのコンストラクタで文字コードを指定しない場合は、プラットフォームのデフォルト文字セットを使うので、 リトルエンディアンとして認識したいのであれば、その旨を指定します。
じゃあ、ヒントだけ。 16進数を、数値に変換するのは[ Integer#parseInt ]を使います。 バイト配列を、文字コードをしていしてStringにするには、Stringのコンストラクタを使います。 Javadocとにらめっこしてみて下さい。 考え方さえ分かれば、すぐに解けるはずです。
補足
16進数の文字コードを10進数に変換することは出来ました。 これを文字にエンコードするためにバイト配列にしなくてはいけませんよね? この方法がよくわかりません。 以下のようにやってみたのですが、うまくいきませんでした。 何かヒントをいただけないでしょうか? よろしくお願いします。 byte[] unibuf = new byte[2]; byte lower = (byte) (10進数のlong型); byte upper = (byte) (10進数のlong型); unibuf[0] = (byte)upper ; unibuf[1] = (byte)lower ; // 書き込む os.print(new String(unibuf));
00a7は、リトルエンディアンで"ア"になりますか??
補足
補足いたします。 文字コードを文字に変換したいということを例で説明いたしました。 00a7が"ア"にはなりませんね^^; 文字コードが書かれたファイル(IN)を読み込んで、文字をファイル(OUT)出力させたいだけなのです。
"00a7"="ア"になる文字コードは何ですか? 単純にするなら、文字コードと対応する文字をマッピングすればいいだけですが。
補足
補足します。 00a7を0x00a7にしてリトルエンディアンにするのですが。。。 下記のソースの"0x00a7"の部分をファイルから読み込んだ文字列00a7 を元に動的に変えたいのです。 byte lower = (byte) (0x00a7 & 0xFF); わかりにくい説明でスミマセン。 また何かあれば補足いたします。 よろしくお願いします。
補足
現状以下のようにプログラムしているのですが、どうもうまく 行っていません。出力されたファイルをバイナリエディタで見ると うまく"A7 00"と出力されているようなのですが。 やり方がおかしいのでしょうか? ByteArrayOutputStream baos = new ByteArrayOutputStream(); String jnetcode = "00a7"; int high = Integer.parseInt(jnetcode.substring(0,2), 16); int low = Integer.parseInt(jnetcode.substring(2,4), 16); baos.write(high); baos.write(low); byte[] result = baos.toByteArray(); outStream.write(result[1]); outStream.write(result[0]);