Java基础之字符集/编码集

378 阅读3分钟

「这是我参与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);
    }
}