1

バイト配列bytesを文字列に変換しました。しかし、文字列内のバイトを計算すると、正しい答えが得られません。のサイズbytesは 125 ですが、129 になっています。コードは以下のとおりです。

    String s2= null;
    try {

        System.out.println(bytes.length);           //This gives 125 as answer
        s2 = new String(bytes,"UTF-8");
        System.out.println(s2.getBytes("UTF-8").length); //But this gives 129 instead of 125
   } 
    catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

上記のコードの何が問題になっていますか?

編集:以下の回答に基づいてbytes、間違った形式でエンコードされています。bytes以下に示すように初期化が行われた場合bytes、余分なデータを失う (または得る) ことなく文字列に変換する方法は?

byte[] bytes=new byte[125];
    for (int i = 0; i < 125; i++) {       
        bytes[bytes.length - i / 8 - 1] |= 1 << (i % 8);
     }

更新:上記のコードでシフト操作を削除すると、正しい出力が得られます。シフトの問題は何ですか?

4

3 に答える 3

2

s2 = new String(bytes,"UTF-8");元の文字列が UTF-8 ではなかったため、追加のバイトが追加された可能性があります。

于 2013-10-28T18:12:10.487 に答える
0

データが実際に UTF-8 でエンコードされていれば、投稿したコードは機能するはずです。bytes

データbytesが他のものである場合は機能しません(ASCIIなどのUTF-8互換エンコーディングを除く)。

これは、考えられるすべてのバイト シーケンスが有効な UTF-8 シーケンスであるとは限らないためです。また、無効なシーケンスの 1 つが検出されると、Unicode 置換文字に置き換えられます。それをバイトに戻すと、元のバイトは再現されません。

あなたはここでより深い問題を抱えているようです:そもそも何でbytes、なぜそれをに変換したい のですか?String

于 2013-10-28T18:20:29.610 に答える