Java字元集


可以使用編碼方案將Unicode字元轉換為位元組序列,反之亦然。java.nio.charset包提供了將CharBuffer編碼/解碼為ByteBuffer類,反之亦然。

Charset類的物件表示編碼方案。CharsetEncoder類執行編碼。CharsetDecoder類執行解碼。可以通過傳遞字元集的名稱作為它的引數,使用它的forName()方法獲得Charset類的物件。

對於簡單的編碼和解碼任務,可以使用Charset類的encode()decode()方法。
以下程式碼顯示如何對儲存在字元緩衝區中的字串Hello中的字元序列進行編碼,並使用UTF-8編碼方案對其進行解碼。

Charset cs  = Charset.forName("UTF-8");
CharBuffer cb  = CharBuffer.wrap("Hello");
ByteBuffer encodedData   = cs.encode(cb);
CharBuffer decodedData   = cs.decode(encodedData);

CharsetEncoderCharsetDecoder類接受要編碼或解碼的輸入塊。Charset類的encode()decode()方法將編碼和解碼的緩衝區返回。

以下程式碼顯示如何從Charset物件獲取編碼器和解碼器物件。

Charset cs  = Charset.forName("UTF-8"); 
CharsetEncoder encoder = cs.newEncoder(); 
CharsetDecoder decoder = cs.newDecoder();

以下程式碼演示如何列出JVM支援的所有字元集。

import java.util.Map;
import java.nio.charset.Charset;
import java.util.Set;

public class Main {
  public static void main(String[] args) {
    Map<String, Charset> map = Charset.availableCharsets();
    Set<String> keys = map.keySet();
    System.out.println("Available  Character Set  Count:   " + keys.size());

    for (String charsetName : keys) {
      System.out.println(charsetName);
    }
  }
}

位元組順序

位元組順序僅在儲存在位元組緩衝器中的多位元組值中有用。 要知道機器的位元組順序,請使用ByteOrder類的nativeOrder()方法。

import java.nio.ByteOrder;

public class Main {
  public static void main(String args[]) {
    ByteOrder b = ByteOrder.nativeOrder();

    if (b.equals(ByteOrder.BIG_ENDIAN)) {
      System.out.println("Big endian");
    } else {

      System.out.println("Little  endian");
    }
  }
}

以下程式碼演示如何獲取和設定位元組緩衝區的位元組順序。使用ByteBuffer類物件的order()方法來獲取或設定位元組順序。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class Main {
  public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.allocate(2);
    System.out.println("Default  Byte  Order: " + bb.order());
    bb.putShort((short) 300);
    bb.flip();
    showByteOrder(bb);

    bb.clear();
    bb.order(ByteOrder.LITTLE_ENDIAN);
    bb.putShort((short) 300);
    bb.flip();
    showByteOrder(bb);
  }

  public static void showByteOrder(ByteBuffer bb) {
    System.out.println("Byte  Order: " + bb.order());
    while (bb.hasRemaining()) {
      System.out.print(bb.get() + "    ");
    }
    System.out.println();
  }
}

上面的程式碼生成以下結果。

Default  Byte  Order: BIG_ENDIAN
Byte  Order: BIG_ENDIAN
1    44    
Byte  Order: LITTLE_ENDIAN
44    1