dポイントプレゼントキャンペーン実施中!

お世話になります。

※タイトル、質問の中に(1)となってしまっていますが、マル1(マルのなかに1が入っている文字です)

以下要件を満たす関数を作りたいと思います
・文字列のINPUTに文字列をOUTPUTとする
・INPUTが60byte以上の場合は60byteに収まるようにしてOUTPUTする
・60byteできったときに最後の文字が2byte文字の場合はその文字は取り除いてOUTPUTする(この場合は60byteより短くなってもよい)

上記の問題を解決するために以下のようなメソッドを作りました。
public static String formatStatement(String realStatement) {
if (realStatement == null
|| realStatement.getBytes().length < CUT_SIZE) {
return realStatement;
}
byte[] b = realStatement.getBytes();
if ((int) b[CUT_SIZE - 1] < 0) {
return new String(realStatement.getBytes(), 0, CUT_SIZE - 1);
}
return new String(realStatement.getBytes(), 0, CUT_SIZE);
}

この場合多くの文字は処理できるのですが、
(1)などの機種依存文字には対応できませんでした。
あとはどのような改良を加えればよいでしょうか?

※(1)などをSystem.out.printlnすると?になってしまいます。この対処方法も教えていただけるとありがたいです。


環境
WindowsXP
Java1.4
開発環境はeclipse2.1

A 回答 (2件)

win2000+J2SDK1.4.0で試しましたが、


私の環境では特にMS932と指定しなくても
DOSプロンプトで表示できました。

class testmain{
public static void main(String[] args) {
System.out.println(formatStatement("0123456789(1)012345678901234567890123456789012345(1)6789012(1)345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"));
}

public static String formatStatement(String realStatement) {
if (realStatement == null
|| realStatement.getBytes().length < 60) {
return realStatement;
}
byte[] b = realStatement.getBytes();
if ((int) b[60 - 1] < 0) {
return new String(realStatement.getBytes(), 0, 60 - 1);
}
return new String(realStatement.getBytes(), 0, 60);
}
}


eclipse2は使ったことないので設定方法はわかりませんが、ソースの保存形式は
SJISになっているのでしょうか?
これがUTF8やEUCになっている可能性があると思います。
またコンパイル時に-encodingを明示的にsjisを指定してみてください。
それでも駄目なら、これ以上は私には分かりません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

ご指摘いただいたとおりでした。
eclipseの設定をUTF-8としていたので
上記の現象になっていた模様です。

ソースの保存形式をMS932としておこなったところ
期待通りの動きを致しました。

ありがとうございました。

お礼日時:2004/07/25 22:24

○の中に1、それは機種依存文字ですね。


同じS-JisでもWindowsのみで定義されています(Mac等では表示できません)
他にも(株)などもそうです。
UNICODEではコード自体存在しません。

ちょっと検索したのですが
エンコードをMS932と指定すれば表示できるかもしれません。

参考URL:http://www.ioctv.zaq.ne.jp/kreuz/java/myref/stri …

この回答への補足

アドバイスありがとうございます。
コードを以下のように変更いたしましたが、
問題解決には至りませんでした。

私が文字コード自体の理解が浅いため
修正方法が誤っているのかもしれません。

byte[] b = null;
try {
b = realStatement.getBytes("MS932");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

補足日時:2004/07/25 20:59
    • good
    • 0

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