• ベストアンサー

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

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あああ"が出力されてほしい

  • ee_bb
  • お礼率70% (7/10)
  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • String <=> byte配列 の際のエンコード

    なんで、 String str = "あいうえお"; byte[] temp = str.getBytes("8859_1"); String str2 = new String(temp, "8859_1"); System.out.println(str2); このコードが ????? を出力するかわかる方、おしえてください。

    • ベストアンサー
    • Java
  • バイト数の取得について

    Byteについて初心者なもので、詳しく教えて頂けませんか? 例)文字列:String str = "123あいう"; 5文字取得したい場合、     str.subString(0,5) ・・・ "123あい" と取得されますが、 5バイト取得("123あ")の場合、どのようにコーディングすればよろしいのでしょうか?

    • ベストアンサー
    • Java
  • 出力ストリームをバイト配列へ変換するには

    出力ストリームをバイト配列へ変換するには いつもお世話になります。 BufferedOutpuStreamで取得したオブジェクトを(ByteArrayOutputStreamでインスタンス生成)、バイト配列へ変換するにはどのようにすればよいでしょうか。 ByteArrayOutputStreamだと、toByteArrayメソッドでバイト配列へ変換できるのですが、効率化を考慮し、BufferedOutputStreamへ出力するように しているのですが、この場合だと取得したBufferedOutputStreamをバイト配列へ変換する方法が分からず困っています。 宜しくお願いします。

    • ベストアンサー
    • Java
  • サーブレットで文字化け

    サーバ Fedora Core 6 / tomcat5.5 クライアントもFedoraなら文字化けしません。 ウィンドウズxpから接続すると文字化けします。 アプレットのプログラムで送信する関数のみ抜粋した。引数sが送信する文字列でこれが文字化けします。送信した変数sをJLabelで表示するとウィンドウズでも文字化けしてなかった。そしてサーバー側のログは文字化けしていたのですが原因がわかりません。どうしたらいいですか? //■アプレット側 文字列送信用関数 public void send(String s) { try { sock = new Socket(サーバのIPアドレス,9999); //■サーバーに接続 fin = sock.getInputStream(); fout = sock.getOutputStream(); ffin = new InputStreamReader(fin); in = new BufferedReader(ffin); out = new PrintWriter(fout,true); out.println("POST / HTTP/1.1"); out.println("Accept: */* "); out.println("Accept-Language: ja"); out.println("Accept-Encoding: gzip,deflate"); out.println("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); out.println("Host: "+getParameter("ipAddress")); out.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8"); out.println("Content-Length: "+(s.getBytes("UTF-8").length)); out.println("Connection: Keep-Alive"); out.println(""); out.println(s); } catch(IOException e) { } } サーバー側 変数sの表示 public void service(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException { //■通信関係 PrintWriter out; BufferedReader in; //■入力した文字列 String st,str; try { //■通信開始 in = new BufferedReader(new InputStreamReader(req.getInputStream())); out = new PrintWriter(res.getOutputStream(),true); //■文字列読み込み st = in.readLine(); str = new String(st.getBytes("UTF-8")); System.out.println("受信した文字列"+str);

  • 長さ3のバイト配列

    長さ3のバイト配列 0~16777215の範囲の数値がありまして byte[ ] byteArrayA =BitConverter.GetBytes(0x00); byte[ ] byteArrayB =BitConverter.GetBytes(0xffffff); で、 00-00-00 FF-FF-FF と、長さ3固定のバイト配列を返して欲しい場合はどうすればいいのでしょう? そのまんまだとINT16かINT32かで配列の個数が違ってきますよね。 INT32型でだと4個の配列になっちゃいますが、3個でいいんです。 どうしましょう?

  • 0バイト文字の送信

    C#ですが、C/C++でも同じだと思うので、 お願いします。 たとえば、"abcde"という文字を、終端文字0バイト として、送信したいのですが、どうしたらいいので しょうか。 string mys="abcde"; byte[] mybyte=new byte[1024]; mybyte=Encoding.UNICODE.GetBytes(mys); mynetwork.Write(mybyte,0,mybyte.Length); こんな感じで、書き出すつもりですが、終端が、 0バイトには、なっていないようです。 (ちなみに、JAVAだと、文字列を、送るので "abcde\0"で、うまくいきます。バイト配列で 送る場合が、わかりません。 分かる人がいましたら、お願いします

  • [再質問]VC#で2進数の文字列をバイト列に変換する方法

    No.1029439で質問して回答頂きましたが、もう一度お願いします。 string strに2進数の文字列がNバイト分入っているとします(0か1が8×N個入っている)。これを1バイト分ずつbyte型の配列に入れたいです。 例えば、str = "1010111100101100"と2バイト分入ってるときは、byte型の配列bytesに bytes[0] =0xAF(10101111) bytes[1] =0x2C(00101100) となるようにしたいです。 最終的には↓のようにして、文字を出力したいためです。 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); string str = sjisEnc.GetString(bytes); http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html よろしくお願いします。

  • javaの文字化けに困っています。

    改善方法はありますか。 public class daytime extends HttpServlet { protected String decodeString(String str){ try{ byte[] byteData = str.getBytes("ISO_8859_1"); str = new String(byteData, "Shift_JIS"); }catch(UnsupportedEncodingException e){ return null; } return str; } public void doGet(HttpServletRequest request ,HttpServletResponse response) response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); String tmp; String name = ""; tmp = request.getParameter("name"); Calendar cal = Calendar.getInstance(); out.println("<html lang=\"ja\" >"); out.println("<head>"); out.println("<title>ContextParam Example</title>"); out.println("<style>"); out.println("</style>"); out.println("<meta http-equiv=\"Content-Type\" Content=\"text/html;charset=Shift_JIS\">"); out.println("</head>"); out.println("<body>"); out.println("<table>"); out.println("<p>"); Connection conn = null; String url = "jdbc:mysql://localhost/list2"; String user = "list2"; String password = "list2"; out.println("</table>"); try { Class.forName("com.mysql.jdbc.Driver").newInstance(); out.println("Mysqlのロードに成功"); conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM goods"; ResultSet rs = stmt.executeQuery(sql); out.println("<table>"); while(rs.next()){ out.println("<tr>"); out.println("<td>" +rs.getInt("id") + "</td>"); out.println("<td>" +rs.getString("name") + "</td>"); out.println("<td>" +rs.getString("mail") + "</td>"); out.println("<td>" +rs.getInt("price") + "</td>"); out.println("<form method=\"GET\" action=\"./daytime3\">"); out.println("<input type=\"hidden\" name=\"id\" value=\""+ rs.getInt("id") + "\">"); out.println("<td><input type=\"submit\" value=\"更新\"></td>"); out.println("<td><input type=\"submit\" value=\"削除\"></td>"); out.println("</form>"); out.println("</tr>"); } out.println("</table>"); rs.close(); stmt.close(); } catch (ClassNotFoundException e){ out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } catch (Exception e){ out.println("Exception:" + e.getMessage()); }finally{ try{ if (conn != null){ conn.close(); out.println("DBに切断"); }else{ out.println("データベースの接続ない"); } }catch (SQLException e){ } } out.println("</p>"); out.println("<tr>"); out.println("</tr>"); out.println("<A HREF='/dddd/daytime2'>登録</A>"); out.println("<A HREF='/dddd/daytime5'>アンケート</A>"); out.println("<div style=\"font-size: 40px; text-align: center; font-weight: bold\">"); out.println(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE)); out.println("</div>"); out.println("</body>"); out.println("</html>"); protected String decodeString(String str){ try{ byte[] byteData = str.getBytes("ISO_8859_1"); str = new String(byteData, "Shift_JIS"); }catch(UnsupportedEncodingException e){ return null; } return str; } } }

  • キャラクタ?バイト?

    下記プログラムを作成しましたが、 b1,b2の配列結果が等しくなりません。 b1の結果はキャラクタデータ(文字)のようですが、 b2の結果はバイトデータのようです。 原因は何故なのでしょうか??? b1は、String型をbyteデータに変換してbyte配列へ b2は、直接byteデータをbyte配列へ import java.io.*; public class Sample { private static final String FILE_NAME = "Output01.txt"; public static void main(String[] args) { // FileOutputStreamクラス宣言 FileOutputStream fos = null; try { fos = new FileOutputStream(FILE_NAME); byte[] b1 = "AB".getBytes(); for (int i = 0; i < b1.length; i++) { fos.write(b1[i]); } byte [] b2 = {(byte)A, (byte)B}; for (int i = 0; i < b2.length; i ++){ fos.write(b2[i]); } } catch (Exception e) { System.out.println("Exception : " + e); } finally { try { fos.close(); } catch (Exception et) { } } } }

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

専門家に質問してみよう