(24)码表

码表

Gbk 中文2字节,英文1个字节

Utf-8 中文3个字节,英文1个字节

Utf-16 = unicode编码,中英文都是占2个字节,英文虽然也是两个字节,但是,英文编码的高字节为0.注意一点,utf-16编码编码时,getbytes前两个是-2 -1 这标志设使用的是utf-16编码。

编码和解码

编码:把看的懂的数字变成看不懂的码值这个过程我们称之为编码

解码:把码值查找对应的字符,这个过程叫做解码。

注意:编码与解码,我们一般使用同一的码表,否则非常容易使用乱码,事实上只是汉字容易重现乱码,英文在任何编码集合中都是兼容的。

str.getbytes()默认使用平台的编码规则进行解码,当然可以手动指定编码规则,比如str.getBytes("utf-8")

new String()默认也是按照平台的编码规则进行编码的,也可以手动指定。new String(bytes, "utf-8")

注意了,使用io时,我们经常从读进来一些字符,保存在String对象中,这时的数据时字符串,我们可以使用getBytes转换成任意的编码,只需要为getBytes传入相应的参数即可。但是byte数组到String时不是随意指定编码的,必须和getBytes中的编码一致,否则就会乱码。

看下面的一个例子:

 1 String str = "大家好";
 2         byte[] buf = str.getBytes();
 3         System.out.println("gbk编码后的数组:"+Arrays.toString(buf));
 4         str = new String(buf, "iso_8859-1");    //这个时候得到的一定是乱码 这些事欧洲文字,控制台无法显示,将以?显示
 5         
 6         //还原乱码 并非多有的乱码都能还原,iso_8859-1是一个特例,每个欧洲文字都用一个字节编码,且刚刚好把256个码值用完,也就是说在他自身的编码体系总,所有的码值和所有的码字都一一对应。
 7         byte[] buf2 = str.getBytes("iso_8859-1");
 8         str = new String(buf, "gbk");
 9         
10         System.out.println(str);
原文地址:https://www.cnblogs.com/OliverZhang/p/6026671.html