• ベストアンサー

文字のバイトサイズの取得

25バイト以上ある文字配列を25バイトまでに切り取りたいのです。 全て半角英数ならstr.substring(0 ,25)ですみますが 日本語も入っているのでsubstringが使えません。 そこで,バイト配列を使おうと思ったのですがうまくいきません。どうかお願いします。 例) String E = "AAAAAAAAAAAAAあああああああ"; byte S[] = new byte[100]; S=E.getBytes(); ByteArrayOutputStream out = new ByteArrayOutputStream(); for(int n = 0; n < 25 ; ++n){ out.write(S[n]); } System.out.println(out.toByteArray()); 結果として"AAAAAAAAAAAAAあああ"が出力されてほしい

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

> System.out.println(out.toByteArray()); 出力したいのはバイト配列そのものではなくて、バイト配列を文字列に変換したものでは? → System.out.println(new String(out.toByteArray())); ところで、 "AAAAAAAAAAAAAあああああああ" から 25 バイト切り取って "AAAAAAAAAAAAAあああ" になるのがよく分からないのですが……。 エンコーディングは何ですか? 文字列⇔バイト配列の変換ではエンコーディングを指定したほうが失敗がないと思います。 // 25 バイト目が文字と文字の間ではない場合はどうしますか?

ee_bb
質問者

お礼

ありがとうございます。 //25 バイト目が文字と文字の間ではない場合はどうしますか 文字化けのままにしておきます。

その他の回答 (2)

  • mura333
  • ベストアンサー率42% (3/7)
回答No.3

No1さんにもありますが、エンコード(もしくは対象OS)が分からないと何とも言えません。 例えば、Windowsのみをターゲットするのなら、MS932前提のコーディングとなりますが、同じソースをLinuxで動かしたら…。 さて、とりあえずWindows前提で回答しますと、No2さんの通り、最後をSystem.out.println(new String(out.toByteArray()));にすれば、結果として「AAAAAAAAAAAAAああああああ」が表示されます。 半角13文字、全角6文字(12バイト)で合計25バイトの文字列です。 しかし、もし運悪く半角Aが14文字あったらどうなるでしょうか?結果は「AAAAAAAAAAAAAAあああああ?」となります。この時にどういう仕様にしましょうか。 あと細かい部分ですが、byte S[] = new byte[100];でnewする必要はありません。次のS=E.getBytes();で参照が切れるので、すぐにgcの対象になります。

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

受け取ったバイト配列から再びStringを作ったらいいのではないでしょうか? String s = new String(out.toByteArray());

ee_bb
質問者

補足

ありがとうございます。 指摘されたように String s = new String(out.toByteArray()); でStringの文字列に戻しました。

関連するQ&A

専門家に質問してみよう