1.为什么要对字符进行编码和解码
由于计算机是采用二进制存储数据的,所以要想在计算机中存储数据就必须使要读取的数据使用特定的规定转化为二进制数据,这样才能使计算机能够识别存储这些数据
2.编码标准
需要了解的编码的标准有: ASCII,Unicode,GBK
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):是最早的字符集编码规则,由美国制定,后来的编码标准基本都会兼容此编码标准,其规定所有字符都占一个字节(8个比特位),不够则在前面补零。
GBK(国标码):是我国为解决中文无法存储使用的问题而制定信息交换标准码,其规定英文字符占一个字节(兼容ASCII码),中文字符占2个字节,且第一个字节必须以1开头,即第一个字节转换成十进制必定为负数,第二位则不做强制要求。
Unicode(万国码):是由美国牵头收录了绝大部分国家字符的通用编码标准,其编码和解码有多种格式例如UTF-8、UTF-16、UTF-32等,由于UTF-16规定所有字符占2-4个字节和UTF-32规定所有字符占4个字节对于一些实际占用字节数小的字符太浪费内存空间了所以用的较少,主要了解UTF-8的编码规则-即对于只占一个字节的字符(英文字符)以零开头,而对于字节数大于1的字符则是第一个字节以n个1(n为占用字节数,例如在UTF-8中规定中文占3个字节则第一个字节的开头必须为3个1)和一个0开头,后面的字节则统一以10开头,解码时去掉这些固定格式;
3.String类的编码和解码
1.编码
对于编码有两种方式,一种是使用默认编码格式(UTF-8),一种是使用指定编码格式
public byte[] getBytes(); //使用默认编码格式
public byte[] getBytes(charsetName); //使用指定编码格式
//默认编码格式:
String str_1="123abc测试代码";
byte[] bytes_1=str_1.getBytes();
System.out.println("默认编码格式:"+Arrays.toString(bytes_1));
//指定编码格式
//注意:使用指定编码格式需要抛出异常
byte[] bytes_2=str_1.getBytes("GBK");
System.out.println("指定编码格式:"+Arrays.toString(bytes_2));
2.解码
对于解码也有两种方式,一种是使用默认编码格式(UTF-8),一种是使用指定编码格式
注意:编码和解码使用的标准和格式必须一致,不然会出现数据异常/乱码
String(byte[] bytes); //使用默认解码格式解码
String(byte[]bytes,charsetNmae);//使用指定解码格式解码
//默认编码格式:
String str_1="123abc测试代码";
byte[] bytes_1=str_1.getBytes();
System.out.println("默认编码格式:"+Arrays.toString(bytes_1));
//指定编码格式
//注意:使用指定编码格式需要抛出异常
byte[] bytes_2=str_1.getBytes("GBK");
System.out.println("指定编码格式:"+Arrays.toString(bytes_2));
//默认解码格式
String str_2=new String(bytes_1);
System.out.println("默认解码格式:"+str_2);
//指定解码格式
String str_3=new String(bytes_2,"GBK");
System.out.println("指定解码格式:"+str_3);