Java IO教程 - 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);
CharsetEncoder和CharsetDecoder类接受要编码或解码的输入块。
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(); } }
上面的代码生成以下结果。