码表
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);