计算机里的所有文件在底层都是二进制文件,即全部都是字节码,图片、视频、音频只是二进制文件的一种表现形式。对于文本文件而言,之所以可以看到一个个的字符,这完全是因为系统将底层的二进制序列转换成字符的缘故。在这个过程涉及到两个概念:编码(Encode)和 解码(Decode)。
Java默认使用 Unicode 字符集,提供了 Charset 类来处理字节序列和字符序列(字符串)之间的转换关系。该类包含了用于创建解码器和编码器的方法,还提供了静态方法 availableCharset() 来获取 Charset 所支持字符集的方法。Charset 类是不可变类。
所谓字符集,就是为每个字符编个号码而已。任何人都可以制定自己独有的字符集,只要为每个字符编个号码即可。可以使用 System 类的 getProperties() 方法来访问本地系统的文件编码格式。
通过 Charset 的 forName() 方法来创建对应的 Charset 对象:1
Charset charset=Charset.forName("UTF-8");
获取了 Charset 对象之后,就可以通过该对象的 newDecoder()、newEncoder() 这个两个方法分别返回 CharsetDecoder() 和 CharsetEncoder 对象。调用 CharsetDecoder 的 decode() 方法就可以将 ByteBuffer(字节序列) 解码转换成 CharBuffer(字符序列),调用 CharsetEncoder 的 encode() 方法就可以将 CharBuffer 或 String(字符序列) 编码转换成 ByteBuffer(字节序列)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21//创建简体中文对应的 Charset
Charset charset_cn=Charset.forName("GBK");
//获取 charset_cn 对象对应的编码器和解码器
CharsetEncoder cnEncoder=charset_cn.newEncoder();
CharsetDecoder cnDecoder=charset_cn.newDecoder();
//创建一个 CharBuffer 对象
CharBuffer cbuffer=CharBuffer.allocate(32);
cbuffer.put('孙');
cbuffer.put('悟');
cbuffer.put('空');
cbuffer.flip();
//将 CharBuffer 中的字符序列转换成字节序列
ByteBuffer bbuffer=cnEncoder.encode(cbuffer);
//循环访问 ByteBuffer 中的每个字节
for(int i=0;i<bbuffer.capacity();i++
{
System.out.println(bbuffer.get(i)+" ");
}
//将 ByteBuffer 中的数据解码成字符序列
System.out.pritnln(cnDecoder.decode(bbuffer);
}
实际上,如果仅仅需要进行简单的编码、解码操作,其实无须创建 CharsetEncoder 和 CharsetDecoder,可以直接调用 Charset 的 encode() 和 decode() 方法:
- CharBuffer decode(ByteBuffer bb):将ByteBuffer中的字节序列转换成字符序列的便捷方法。
- ByteBuffer encode(CharBuffer cb):将CharBuffer中的字符序列转换成字节序列的便捷方法。
- ByteBuffer encode(String str):将String中的字符序列转换成字节序列的便捷方法。
在String类里也提供了一个 getBytes(String charset) 方法,该方法返回 byte[],该方法也是使用指定的字符集将字符串转换成字节序列