プロが教える店舗&オフィスのセキュリティ対策術

はじめまして、よろしくお願いします。

ファイルに書かれた文字コードをJavaで読み込み、その文字コードに対応する文字を別のファイルに出力するプログラムの書き方を教えてください。

例えば"00a7"と書かれたファイルを読み込み、別ファイルに"ア"として表示させたいのです。

よろしくお願いします。

A 回答 (6件)

"00a7"="ア"になる文字コードは何ですか?


単純にするなら、文字コードと対応する文字をマッピングすればいいだけですが。

この回答への補足

補足します。
00a7を0x00a7にしてリトルエンディアンにするのですが。。。
下記のソースの"0x00a7"の部分をファイルから読み込んだ文字列00a7
を元に動的に変えたいのです。

byte lower = (byte) (0x00a7 & 0xFF);

わかりにくい説明でスミマセン。
また何かあれば補足いたします。
よろしくお願いします。

補足日時:2007/10/16 14:56
    • good
    • 0

00a7は、リトルエンディアンで"ア"になりますか??

この回答への補足

補足いたします。

文字コードを文字に変換したいということを例で説明いたしました。
00a7が"ア"にはなりませんね^^;

文字コードが書かれたファイル(IN)を読み込んで、文字をファイル(OUT)出力させたいだけなのです。

補足日時:2007/10/16 17:43
    • good
    • 0

じゃあ、ヒントだけ。



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

補足日時:2007/10/16 20:26
    • good
    • 0

lowerとupperの値は何が入ってますか?


Stringのコンストラクタで文字コードを指定しない場合は、プラットフォームのデフォルト文字セットを使うので、
リトルエンディアンとして認識したいのであれば、その旨を指定します。

この回答への補足

現状以下のようにプログラムしているのですが、どうもうまく
行っていません。出力されたファイルをバイナリエディタで見ると
うまく"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]);

補足日時:2007/10/17 15:32
    • good
    • 0

うまくいってないという根拠は何ですか?


理想の結果と、現状を示して下さい。
    • good
    • 0

 シフト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()); };

};

}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!