web-dev-qa-db-ja.com

Javaで文字をバイトとして表す

Charをバイトまたはバイト配列に変換する必要があります。他の言語では、charは1バイトに過ぎないことを知っています。ただし、Java文字クラスを見ると、最小値は\ u0000で、最大値は\ uFFFFです。これにより、charは2バイト長のように見えます。

1バイトとして保存できますか、それとも2バイトとして保存する必要がありますか?

誰かが尋ねる前に、自分の結果がバイト配列であることを期待するインターフェイスの下で作業しているので、これを実行しようとしていると言います。ですから、charを1に変換する必要があります。

私に知らせて、これを理解するのを手伝ってください。

ありがとう、jbu

24
jbu

文字をバイトに変換するには、 文字エンコーディング を指定する必要があります。文字エンコーディングによっては、文字ごとに1バイトを使用するものと、2バイト以上を使用するものがあります。実際、多くの言語では、1バイトでエンコードするには文字が多すぎます。

Javaでは、文字からバイトに変換する最も簡単な方法は、Stringクラスの getBytes(Charset) メソッドを使用することです。 ( StandardCharsets クラスはいくつかの一般的なエンコーディングを定義します。)ただし、このメソッドは、指定されたエンコーディングで文字をマッピングできない場合、文字をサイレントに�で置き換えます。さらに制御が必要な場合は、 CharsetEncoder を構成して、このケースをエラーで処理するか、別の置換文字を使用できます。

35
erickson

Charは確かにJavaの16ビットです(そして、唯一の符号なしタイプでもあります!!))。

文字のエンコードがASCIIであることが確実な場合は、バイトにキャストすることができます(ASCIIはcharの下位7ビットのみを使用するため)。

文字を変更する必要がない場合、または文字列内の文字の意味を理解する必要がない場合は、次のように2バイトで文字を格納できます。

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(速度が重要な場合は、2 *を右シフトに置き換えることをお勧めします)。

ただし、一部の実際の(表示された)文字(より正確には、Unicodeコードポイント)は、2つの連続した文字で書かれていることに注意してください。したがって、2つの文字の間で切り取っても、実際の文字の間で切り取られているとは限りません。

文字配列対応の方法でchar配列をデコードまたはエンコードする必要がある場合は、Java.ioツールを使用してchar配列または文字列をデコードおよびエンコードして、適切な文字操作を確保する必要があります。

8
Varkhan

他の人が言っていることを拡張するには、バイト配列として必要な文字がある場合は、最初にその文字を含む文字列を作成し、次に文字列からバイト配列を取得します。

private byte[] charToBytes(final char x) {
  String temp = new String(new char[] {x});
  try {
    return temp.getBytes("ISO-8859-1");
  } catch (UnsupportedEncodingException e) {
    // Log a complaint
    return null;
  }
}

もちろん、適切な文字セットを使用してください。これは、一度に1つのcharを取り、文字列に変換してからバイト配列に変換するのではなく、文字列の操作を開始するよりもはるかに効率的です。

4
Eddie

char in Javaは符号なし16ビット値です。お持ちのものが7ビットに収まる場合は、バイトにキャストしてください(たとえばASCIIフィット)。

Java.nio.charset APIもチェックアウトできます。

0
TofuBeer