Board logo

标题: 深入分析 Java 中的中文编码问题 (3) [打印本页]

作者: look_w    时间: 2018-9-23 12:43     标题: 深入分析 Java 中的中文编码问题 (3)

Java 中如何编解码前面介绍了几种常见的编码格式,这里将以实际例子介绍 Java 中如何实现编码及解码,下面我们以“I am 君山”这个字符串为例介绍 Java 中如何把它以 ISO-8859-1、GB2312、GBK、UTF-16、UTF-8 编码格式进行编码的。
清单 2.String 编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void encode() {
       String name = "I am 君山";
       toHex(name.toCharArray());
       try {
           byte[] iso8859 = name.getBytes("ISO-8859-1");
           toHex(iso8859);
           byte[] gb2312 = name.getBytes("GB2312");
           toHex(gb2312);
           byte[] gbk = name.getBytes("GBK");
           toHex(gbk);
           byte[] utf16 = name.getBytes("UTF-16");
           toHex(utf16);
           byte[] utf8 = name.getBytes("UTF-8");
           toHex(utf8);
       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       }
}




我们把 name 字符串按照前面说的几种编码格式进行编码转化成 byte 数组,然后以 16 进制输出,我们先看一下 Java 是如何进行编码的。
下面是 Java 中编码需要用到的类图
图 1. Java 编码类图首先根据指定的 charsetName 通过 Charset.forName(charsetName) 设置 Charset 类,然后根据 Charset 创建 CharsetEncoder 对象,再调用 CharsetEncoder.encode 对字符串进行编码,不同的编码类型都会对应到一个类中,实际的编码过程是在这些类中完成的。下面是 String. getBytes(charsetName) 编码过程的时序图
图 2.Java 编码时序图从上图可以看出根据 charsetName 找到 Charset 类,然后根据这个字符集编码生成 CharsetEncoder,这个类是所有字符编码的父类,针对不同的字符编码集在其子类中定义了如何实现编码,有了 CharsetEncoder 对象后就可以调用 encode 方法去实现编码了。这个是 String.getBytes 编码方法,其它的如 StreamEncoder 中也是类似的方式。下面看看不同的字符集是如何将前面的字符串编码成 byte 数组的?
如字符串“I am 君山”的 char 数组为 49 20 61 6d 20 541b 5c71,下面把它按照不同的编码格式转化成相应的字节。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0