「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
1 字符集/编码集
基础知识
-
计算机中储存的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果
-
按照某种规则, 将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。这里强调一下: 按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会导致乱码现象
-
字符集(character set)是一个系统支持的所有抽象字符的集合。字符(character)就是各种文字和符号,包括国家文字、标点符号、图形符号、数字等。
-
如果仅仅是抽象的字符集,其实是顾名思义的,但是我们常说的字符集,其实是指编码字符集(coded character set),比如: Unicode、ASCII、GB2312、GBK等等。什么是编码字符集呢?编码字符集是指,这个字符集里的每一个字符,都对应到唯一的一个代码值,这些代码值叫做代码点(code point),可以看做是这个字符在编码字符集里的序号,字符在给定的编码方式下的二进制比特序列称为代码单元(code unit)。在Unicode字符集中,字母A对应的数值是十六进制下的0041,书写时前面加U+,所以Unicode里A的代码点是U+0041。
-
字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A,65)
-
字符集:各个国家为自己国家的字符取的一套编号规则
-
GBK编码:一个中文字符一般占用2个字节
-
UTF-8:一个中文字符一般占3个字节
-
注意:采用何种规则编码,就采用对应规则解码,否则就会报错
字符串编码
byte[] getBytes():使用平台的默认字符集将该String编码为一系列节, 将结果存储到新的字节数组中byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
字符串解码
-
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String -
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
package test;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
//定义一个字符串
String s= "中国";
//1,byte] getBytes():使用平台的默认字符集将该String编码为-系列节, 将结果存储到新的字节数组中
byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
//2,byte[ ] getBytes(String charsetName):使用指定的字符集将该String编码为-系列字节,将结果存储到新的字节数组中
// byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
// byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6]
System.out.println(Arrays.toString(bys));
//3,String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
/*String ss = new String(bys);
System.out.println(ss); //中国*/
//4,String(byte0] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
// String ss = new String(bys,"UTF-8");//中国
String ss = new String(bys,"GBK"); //涓浗
System.out.println(ss);
}
}