2

char[]をbyte[]に変換する次のコードを取得しました。

char[] cPwd = {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
byte[] bPwd = new byte[cPwd.length * 2];
ByteBuffer.wrap(bPwd).asCharBuffer().put(cPwd);

私が推測しているのは、上記のコードはデフォルトのプラットフォームエンコーディング(UTF-8または16だと思います)を使用するということです。右?

上記のchar[]の文字が、デフォルトのプラットフォームエンコーディングに依存するのではなく、特定のエンコーディング、たとえばUTF-16を使用していることを確認するにはどうすればよいですか?

ps-私のシナリオには制約があります:このchar[]を次のような文字列に変換することは許可されていません

String str = new String(cPwd, "UTF-16");

前もって感謝します。

アレックス。

4

2 に答える 2

2

VMがそれらを認識するまでに、コードでリテラルとして指定する文字は16ビットのUnicode文字になります。asCharBuffer()メソッドは、エンコーディングを実行するように指定されていません。つまり、ByteBufferのエンディアンに応じて、リトルエンディアンまたはビッグエンディアンのUTF-16を効果的に取得する必要があります。

Stringコンストラクターを経由せずに別のエンコードが必要な場合は、CharSet.encode()メソッドを使用できます。

        CharBuffer cb = CharBuffer.wrap(your chars);
        Charset cs = Charset.forName("UTF-8");
        ByteBuffer bb = cs.encode(cb);
于 2012-06-11T02:42:15.567 に答える
1

私が推測しているのは、上記のコードはデフォルトのプラットフォームエンコーディング(UTF-8または16だと思います)を使用するということです。右?

私はそうは思わない。javadocの私の理解が正しければ、asCharBuffer()メソッドは、エンコードを行わずに文字をバイトとして表す「ビュー」を返します。したがって、バイトバッファには、BOMを含まないUTF-16と同等の値(つまり、1文字あたり2バイト)が含まれます。

于 2012-06-11T02:55:05.407 に答える