编码:字符串转成字符数组
解码:字节数组转成字符串
String类中的字段,charsetName:编码字符集
String -> byte[] Str.getBytes(charsetName)
byte[] -> String new String(byte[] b,charsetName)
我们用UTF-8将"你"编码后,返回的字节数值是-28, -67, -96,
十进制:-28 二进制是:11100100 十六进制:E4 对应无符号整数:228
-67 10111101 BD 189
-96 10100000 A0 160
"你"的UTF-8码是 E4 BD A0
"浣"的GBK 码是 E4 BD
最后的A0 解码后是"?",是不可识别的字符
所以如果我们将字符"你"使用UTF-8编码,用默认的GBK解码,打印的是字符"浣?"
[示例]:字符编码解码练习
import java.util.*;
class Demo
{
public static void main(String[] args) throws Exception
{
String str = "你";
byte[] b1 =str.getBytes("UTF-8"); //编码
String sopStr =Arrays.toString(b1);//返回指定数组内容的字符串表示形式
sop(sopStr); //[-28, -67, -96]
String s1 = new String(b1); //解码,使用平台的默认字符集解码指定的 byte 数组
sop("s1:"+s1); //"浣" , 由于默认是GBK解码,所以打印"浣"
String s2 = new String(b1,"UTF-8");
sop("s2:"+s2); //"你" ,UTF-8解码打印"你"
//如果我们将"你"解码错了,本来要使用UTF-8解码,误用"iso8859-1"解码了
//由于西欧字符集与中文系统不兼容,我们用"iso8859-1"解码出来的是乱码
String errStr = new String(b1,"iso8859-1");
sop("errStr:"+errStr); //"???", 解码错误,乱码
byte[] bErr = errStr.getBytes("iso8859-1"); //返炉重编
sop(new String(bErr,"UTF-8"));//"你",解码成功
//注意:这种方法不适合于相同的字符体系
//因为当用GBK解码UTF-8没找到字符时,它会到备用字符集中区找,返回的字符是走样的
//不是原来的"你"的值了,用getBytes方法重新编码只会得到乱码
}
public static void sop(Object obj) //打印
{
System.out.println(obj);
}
}