ASCII编码:128个字符
ISO-8859-1:可以表示256个字符,前128个和ASCII相同
汉字编码集GB2312:包含682个英文,字母等符号以及常见的6763个简体中文,台湾设置了一套繁体中文编码BIG5(大五码)
GB2312和BIG5都使用一个字节存储ASCII中包含英文,数字,常见符号,使用两个字节存储简体中文或者繁体中文
GBK是GB2312的扩展,支持简体中文和繁体中文,使用一个字节存储ASCII中包含英文,数字,常见符号,使用两个字节存储简体中文或者繁体中文
GB18030兼容GBK,包含中文,生僻字,少数民族文字,日文,朝鲜文纳入统一编码,可以使用1个字节,2个字节,4个字节存储一个字符
最后国际社会给出了所有字符统一的编码,统一的字符集规范(Unicode)国际标准字符集。
Unicode的具体实现,UTF-8,UTF-16,Unicode通过一定的算法将每种语言中的每个字符转为了UTF-8/UTF-16等具体编码类型,UTF-8存储各类字符所占用的字节数。
Java版本编解码的实例:
public static void main(String args[]) throws CharacterCodingException {
Charset charset = Charset.forName("utf-8");
//获取utf-8编码器
CharsetEncoder charsetEncoder = charset.newEncoder();
//获取utf-8解码器
CharsetDecoder charsetDecoder = charset.newDecoder();
//后续存储的“颜群JAVA讲师”共16字节:UTF中,每个常见汉字占3个字节;每个英文占1个字节。
CharBuffer charBuffer = CharBuffer.allocate(16);
charBuffer.put("张三JAVA学习");
charBuffer.flip();
System.out.println("编码开始");
//编码 :String->byte[],使用utf-8类型的编码器
ByteBuffer byteBuffer = charsetEncoder.encode(charBuffer);
for (int i = 0; i < 16; i++) {//一个汉字占3个字节
System.out.print(byteBuffer.get() + "\t");
}
System.out.println("\n编码结束\n");
byteBuffer.flip();
//解码:二进制->String,也使用utf-8类型的编码器
System.out.println("---解码开始1---");
charBuffer = charsetDecoder.decode(byteBuffer);
System.out.println(charBuffer.toString());
System.out.println("---解码结束1---\n");
//byteBuffer中存储的是经过UTF-8类型编码器编码后的字节码,但以下却是使用gbk类型的解码器解码,因此会出现乱码
Charset charset2 = Charset.forName("gbk");
byteBuffer.flip();
System.out.println("---解码开始2---");
charBuffer = charset2.decode(byteBuffer);
System.out.println(charBuffer.toString());
System.out.println("---解码结束2---\n");
}