字符集在将字节与字符之间进行转换时起到编码和解码的作用。不同的字符集在转换时采取不同的方式。比如UTF-8是8位Unicode转换格式(一个字符=一个字节),UTF-16是16位Unicode转换格式(一个字符=两个字节)。无论如何,字节是机器的语言,字符才是人类的语言。
?
举例:
class="java">package stream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.util.Set; import java.util.SortedMap; public class CharsetTest { /** * @param args */ public static void main(String[] args) { // 打印JVM 使用的默认字符集。修改默认字符集可以通过eclipse右键点项目选择properties->Resources里面改。 System.out.println("Default charset is:" + System.getProperty("file.encoding")); // 打印所有可用的字符集 SortedMap<String, Charset> sm = Charset.availableCharsets(); Set<String> keyset = sm.keySet(); System.out.println("All available charsets:"); for (String s : keyset) { System.out.println(s); } // 使用字符集 String s = "Hello World"; Charset cs_utf16 = Charset.forName("UTF-16"); // 编码(字符->字节) ByteBuffer bb = cs_utf16.encode(s); byte[] byteArray = bb.array(); // 将编码后的字节数组再解码(字节->字符),使用与编码同样的字符集才可以。 ByteBuffer bb2 = ByteBuffer.wrap(byteArray); CharBuffer cb = cs_utf16.decode(bb2); System.out.println(cb.toString()); } }
?
?常用API:
java.nio.charset.Charset 1.4
static SortedMap availableCharsets() 获取这个虚拟机可用的所有字符集。返回一个映射表,它的键是字符集的名字,值是字符集。 static Charset forName() 获取给定名字的字符集。 Set aliases() 返回这个字符集的别名集。 ByteBuffer encode(String str) 将给定的字符串编码为字节序列。 CharBuffer decode(ByteBuffer buffer)解码给定的字节序列。无法识别的输入将被转换为
Unicode的“替代字符”('\uFFFD').
?
java.nio.ByteBuffer 1.4
byte[] array() 返回这个字节缓冲区所管理的字节数组。 ByteBuffer wrap(byte[] bytes) 返回字节缓冲区,并且该缓冲区包含该字节数组。 ByteBuffer wrap(byte[] bytes, int offset, int length) 返回给定范围的字节数组的字节缓冲区。?
java.nio.CharBuffer
char[] array() 返回这个缓冲区所管理的码元数组。 char charAt(int index) 返回给定索引处的码元。 String toString() 返回这个缓冲区管理的码元数组组成的字符串。?