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