2012-03-13 15 views
1

出力ストリームにテキストを書き、入力ストリームを使用してそのテキストを別の場所に戻さなければならないという要件がありました。バイトから文字列へ| Java

出力を書き込むために、string.getByte()を使用してバイト配列に変換しています。読み込み中、stringはコンストラクタString(byte [])を使って形成されます。

ここでの質問は、読んだ文字列が私が見たいと思ったものではないということです。すべての英数字がそのまま読み込まれますが、書かれた文字列の他の特殊文字の場合は、ASCII値の前に%記号が表示されます。この

private stringToByte(){ 
     String data="\"X=Y;Z=A;B=C;\"" 
     byte[] byteArray=data.getByte(); 
     String readData=new String(byteArray); 
     System.out.println("data:"+readData); 
    } 

のような文字列、何かをバイト配列に文字列を変換して再構築などの

も、最も世俗的なことは、同じ結果を生産しています。 は、今これは

data:%22X=Y%3BZ=A%3BB=C%3B%22 

のように見えた後に生成取得された文字列は、今私の最初の仮定は、エンコーディングがデフォルトの文字セットを使用して行われているので、それがエンコードされなければならないということでした。しかし、この動作は同じJVM内の同じマシン上でさえ明らかです。

私はそれが私がランダムに異なる文字セットの名前をしようとしていたとして、それが状況を悪化させ、持っていなければならないとして、

String readData=new String(byteArray,"diffent character set name"); 

を使用しかしでヒットし、トレイルの道を進んでみました。

うまくいけば、あなたは私のジンクスにブレーキをかけます。私はこのスキームでどこが愚かなのかを指摘できますか?

多くの方々に感謝します。 :)

答えて

1

あなたのサンプルコード(タイプミスを無視して)は、私のマシンでテストするとうまく動作します。また、特殊文字の%XXの表記は、あなたが記述するよりもずっと多くのことがあることを示唆しています。これはPercent Encodingのようになります。そして、それはString.getBytes()によって引き起こされたようなものではありません。

あなたが話すサーバーは、パーセントエンコーディングを使用しており、それをデコードできません。

+0

ありがとう、Durandal!間違いなく多くのことが起こっていました。そして、私はそれらが見えないほど盲目でした! URLEncoder.encode(data)を使用して文字列がエンコードされていました。元のデータを取得するためにURLDecoder.decode(data)を使用するだけでした。 – mawia

4

このようにCharset.forName(...)を使用してください。以下の例で使用可能な文字セットを照会することもできます。

String data = "\"X=Y;Z=A;B=C;\""; 
byte[] byteArray = data.getBytes(Charset.forName("ISO-8859-1")); 
String readData = new String(byteArray, Charset.forName("ISO-8859-1")); 
System.out.println("data:" + readData); 

for (String name : Charset.availableCharsets().keySet()) { 
    System.out.println(name); 
} 
+0

これを試しましたが、残念なことに同じ結果が出ました。さらに、私たちはこれをかなり成功裏に実行している第三者サーバーに送信しているため、エンコードを変更できません。私は、これをprodに置く前に、そのサーバに送信されているデータをテストするために書かれているテストユーティリティを解読する必要があります。あなたは私の創造性がデータを読むことに制限されていて、書くコードを変更できないことを理解することができます。 – mawia

3

あなたの例は、私のマシンで動作します(欠落しているようないくつかのタイプミスを修正し、getByteではなくgetBytes)。

byte[] byteArray=data.getBytes(Charset.forName("UTF-8")); 
String readData=new String(byteArray, Charset.forName("UTF-8"));  

のようにエンコードを強制しましたか?

関連する問題