• ベストアンサー

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

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

  • Java
  • 回答数1
  • ありがとう数1

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

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

Harry_ さんの回答履歴を見る限り、あなたはこの質問の答えがわかっていて当然だと思うのですが…… 8859_1 は、欧文用のエンコードですよね。半角英数字などの欧文用文字には対応していますが、日本語のひらがなや漢字には対応していません。ですから、日本語を 8859_1 エンコードで表そうとしても不可能です。 したがって、コードの2行目で getBytes メソッドの返すバイト配列は、この時点で 0x3f 0x3f 0x3f 0x3f 0x3f (?????) になっています。 もちろん、3行目の 8859_1 エンコードによるバイト配列から Unicode の文字列に変換する作業はうまくいっています。ただし、引数のバイト配列の中身は、「?????」なのです。

Harry_
質問者

お礼

回答ありがとうございます。 8859-1エンコードには日本語文字も含まれていると ずっと勘違いしていました。 >Propertiesクラスのloadメソッドは、ストリームをISO8859_1として >読み込みます。この中で、バイト配列→Stringオブジェクトの誤った >変換がなされているので、 回答履歴というのは、このことだと思います。 非常にはずかしい話ですが、8859-1が日本語を表すことができない、 という意味ではなく、単にMS932と異なるエンコードだから 誤変換している、というつもりで回答しておりました。 これに続いて書いた、ちゃんと動かないコードから私の勘違いが 見てとれると思います。 最近になって、そのコードがうまく動作しないことに気づき、 今回の質問をさせてもらうことにしました。 確認もしないで回答したことは、深く反省しています。 ありがとうございました。

関連するQ&A

  • String または byte[]を16進に変換するには

    String または byte[]をデバッグ目的で16進に変換するには、1文字ずつ処理すればいいのですが、ヘキサ表示なんてだれもが行うものですからすでにライブラリ化されていないでしょうか? sun.misc.HexDumpEncoder クラスは見つけたのですが、このほかに16進変換に使えるクラスはありませんでしょうか。(apache-commonsなら安心して使えるのでうれしいです) HexDumpEncoder encoder = new HexDumpEncoder(); String encoded = encoder.encode("abcde".getBytes()); System.out.println(encoded); 出力 0000: 61 62 63 64 65 希望としては 0000:  は不要なので 61 62 63 64 65 6162636465 0x6162636465 などに変換できると助かります。

  • byte[]→String変換後の文字列が違うのはなぜ?

    byte[]→String変換の処理を行っていたのですが、 使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。 byte[] bt; String str1 = "12345", str2; bt = str1.getBytes(); (1)str2 = new String(bt); (2)str2 = bt.toString(); (1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Stringオブジェクトの文字コードの変換

    NewString = new String(b.getBytes("iso-8859-1"),"Shift_JIS"); でShift-Jisに変換できるとありましたが、どうも出力の 日本語部分が3Fになってしまってうまくいきません。 テスト用に以下のコードを作ってみました。 import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.FileOutputStream; public class Test { public static void main(String[] args) { try{ String regex_title; regex_title = "制限をしている場合"; System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getUTF8(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getShiftJIS(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); }catch(Exception ex){ } } public static String getHexString(byte[] b){ String buff=""; try{ for(int i=0;i<b.length;i++) buff += String.format("\\x%02x", b[i]); }catch(Exception ex){ } return buff; } public static String getUTF8(String b){ try { //UTF-8へ変換 return new String(b.getBytes(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); return b; } } public static String getShiftJIS(String b){ try { //UTF-8へ変換 return new String(b.getBytes(),"Shift_JIS"); } catch (Exception e) { e.printStackTrace(); return b; } } // @Override } //////////////////////////////////////////////////////////// 1. System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); の部分の出力をみると3Fに変換されています。 regex_title.getBytes("iso-8859-1")の時点で3Fな事がわかります。 何故でしょうか? 私がやりたい事はStringの内部のコードをUTF8にする事です。 NewString = new String(b.getBytes("iso-8859-1"),"UTF-8"); では、出来ていないようでした。 2. また、以下のコードを実行するとtest.txt test2.txtともに 文字コードがShiftJisで出力されるのはなぜでしょうか? 変換を行わなければ内部処理形式のUnicodeで出力されるの ではないのでしょうか? regex_title = "制限をしている場合"; FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); File file = new File("./test2.txt"); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write(regex_title); bw.close(); 上はgetBytes()が変換してるのでしょうか? 下はBufferedWriterかFileWriterが変換してる? ではString内部のByteをそのまま出力するにはどうしたら・・・。

    • ベストアンサー
    • Java
  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

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

    前回の質問(4つほど前の)の続きですが、 8859-1が日本語を扱うことができるという勘違いは、 サーブレットで日本語のリクエストパラメータを使用する際の、 次のようなコードに起因してます。 String param = new String(request.getParameter("test")).getBytes("8859_1"), "JISAutoDetect"); ここで、request.getParameter("test") から返ってくる String は 8859-1エンコーディングされたものだと単純に考えていたのですが、 今回、あらためてこれについて考えてみました。 request.getParameter("test").getBytes("8859_1") で、 ブラウザのエンコーディングを用いた、パラメータを表現するバイト列が ちゃんと取得できています。 では、request.getParameter("test") の結果返ってくる String は ブラウザのエンコードでパラメータを表現するバイト列を用い、 値はそのままで、エンコード名だけを8859-1として構築されたもの、 になると思うのですが、 そういう認識で正しいのでしょうか。 また、それで正しいのなら、それと同じことを自分で行うには どうすればよいのでしょうか。 とても気になります。 もしわかる方がいらっしゃったら、是非回答お願いします。

    • ベストアンサー
    • Java
  • String定数プールと"==演算子"との関係。

    String str1 = new String("str1"); String str2 = new String("str1"); String str3 = "str1"; if(str1 == str2){    System.out.println("same!"); } if(str1 == str3){    System.out.println("same!"); } 上記のコードで実行すると、"same!"が実行されません。 Stringオブジェクトには定数プールがあって、新たにStringオブジェクトが作成されたとき、定数プールに入っているそれまでに存在していたStringオブジェクトの値と同じであったら、新たにStringオブジェクトを作らず、それまでにあったStringオブジェクトの参照を当てるということなのです。 それに従えば、str2,str3はstr1と同じStringオブジェクトを参照しているはずだから、if文の結果はtrueになるはずなんですが、、、。 適切な回答をいただきたく思います。よろしくお願いいたします。

  • 日本語が文字コードによってはエンコード出来ない?

    以下のソースを実行したところ、getBytes()に渡す文字コードによっては、 「??????????」 というように文字化けをするのですが、原因を教えてください。 -----ソース----- import java.io.UnsupportedEncodingException; public class hoge { public static void main(String[] args) { String str = "ほげもがフンコロガシ"; try { System.out.println( new String(str.getBytes("ISO8859_1"), "MS932")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } --------------- -----出力結果----- str.getBytes("ISO8859_1") の場合 「??????????」 str.getBytes("MS932") の場合 「ほげもがフンコロガシ」 str.getBytes() の場合(引数無し) 「ほげもがフンコロガシ」 ------------------ -----環境情報----- OS:WindowsXP_sp3(32bit) Eclipse:Eclipse Java EE IDE for Web Developers(Helios Build id: 20100617-1415) JRE/JDK:jdk1.4.1_06 ------------------

  • binaryへのbyte配列の入れ方

    私は現在データベースの勉強をしている学生です。 開発環境はJDBCを使い、SQLiteにデータを入れています。 最終的には画像データ(byte)をデータベースに中に入れようと思っているのですが、まずは手始めに数字を、binaryで宣言したデータベースの中に入れたのですが、おもうような結果が得られず困っています。 具体的にソースで説明させていただくと、 String sql1 = "create table Pointing (B binary)"; statement.executeUpdate(sql1); byte[] b = new byte[2]; b[0] = 3; b[1] = 2; String sql2 = "insert into Pointing values(" + b[0] + b[1] + )"; statement.executeUpdate(sql2); ResultSet rs2 = statement.executeQuery("select * from Pointing"); while(rs2.next()) { byte[] b2 = rs2.getBytes("B"); System.out.println("B = " + b2[0]); } この結果が51となってしまいます。 正直、入れ方や取り出し方も全部いろんなサイトから引っ張ってきたり、憶測等で書いたものなので、やり方があっているとはおもっていません。なので正しい方法を知りたく書かせていただきました。 ご回答お待ちしております。

    • ベストアンサー
    • MySQL
  • 文字のバイトサイズの取得

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

    • ベストアンサー
    • Java
  • Javaの文字コード変換方法

    文字コードの変換で困っています。 例えば、標準入力で「あいう」と入力して、その文字列を UTF-8に変換して出力したいのですが、うまくいきません。 サイトにはbyteに変換してから入れると書いていましたが、 よくわかりませんでした。 宜しくお願いします。 以下、今できているソースです。 (ソースコード) import java.io.*; public class ChangeCord { public static void main( String[] args ) { try { System.out.println("何か日本語を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in, "UTF-8")); String str = br.readLine(); System.out.println("文字コードUTF-8に変換した結果"); System.out.println(str); }catch (Exception e) { System.out.println("エラー"); } } } (出力結果) 何か日本語を入力してください。 あいう 文字コードUTF-8に変換した結果 ?????? 以上です。

    • ベストアンサー
    • Java

専門家に質問してみよう