字符集
汉字和字母的编码特点:如果是存储字母,采用1个字节来存储,一共8位,第一位是0如果是存储汉字,采用2个字节来存储,一个是16位,第一位是1
当读取文件中的字符时,通过识别读取到的第1位是0还是1来判断是字母还是汉字
如果读取到第1位是0,就认为是⼀个字⺟,此时往后读1个字节。如果读取到第1位是1,就认为是⼀个汉字,此时往后读2个字节。
GBK:
GBK一个字母占1个字节,一个汉字占2个字节;表示中国人使用的汉字
Unicode:
因为各个国家互不兼容,所以有了通用的一套字符集:Unicode字符集,它一个字符采用4个字节存储;一个字母、数字占1个字节,一个汉字占3个字节
UTF及特点:
但对于说英语的国家只需要26个大小写字母和标点,本身一个字节就可以表示,用4个字节就比较浪费,所以又对Unicode字符集中的字符进行了重新编码,设计了三种编码方案,分别是UTF-32 , UTF-16 , UTF-8,其中比较常用的是UTF-8。
UTF-8是一种可变长的编码方案,英文字母和数字占1个字节,汉字占3个字节,极少数字符占4个
UTF-16是一种固定长度编码,通常情况一个汉字占2个字节,一些特殊汉字(编码超过了0xFFFF)会占4个字节(2个16位代码单元)
UTF-32是一种固定长度编码,每个字符都占用4个字节(32位)
编码和解码:
编码:把字符串按照指定的字符集转为字节数组
/*编码*/
String date="a我b";
byte[] bytes=date.getBytes();
System.out.println(Arrays.toString(bytes));//[97, -26, -120, -111, 98]
/*按指定字符集进行编码*/
byte[] bytes1=date.getBytes("GBK");
System.out.println(Arrays.toString(bytes1));//[97, -50, -46, 98]
解码:把字节数组按照指定的字符集转换为字符串
/*解码*/
String s1=new String(bytes);
System.out.println(s1); //a我b
String s2=new String(bytes1,"GBK");
System.out.println(s2); //a我b
CharSet:
首先通过forName()来设置编码和解码字符集,类中提供 encode 与 decode 分别对应 char[] 到 byte[] 的编码和 byte[] 到 char[] 的解码,用法如下:
Charset charset = Charset.forName("UTF-8");
ByteBuffer byteBuffer = charset.encode(string);
CharBuffer charBuffer = charset.decode(byteBuffer);