字符型

Java中使用单引号表示字符型 char,其在内存中占2字节(无论字母、数字、符号、中文),用来表示Unicode编码表中的字符。

char 类型本质上是UTF-16编码,而UTF-16实际上是个变长编码(2字节或4字节),显而易见,char 类型只能放UTF-16编码下只占2字节的那些字符。

char 类型我们看到的样子就是它本身的字面常量,但是底层在进行计算的时候,实际上是按照ASCII码进行计算的。

public class Test{
        public static void main(String[] args){
                char ch1 = 'A';
                System.out.println(ch1); // A
                System.out.println(ch1+90); // 155,若为ch1+"90"应该为A90
                System.out.println(155-ch1); // 90

                char ch2 = '中';
                System.out.println(ch2); // 中
                System.out.println(ch2+90); // 20103
                System.out.println(20103-ch2); // 90
            
                // 转换
                int num1 = (int)ch2;
                System.out.println(num1); // 20013
            
                char ch = (char)20013;
                System.out.println(ch); // 中
            
                int num2 = '中';
                char ch5 = 20013;
                System.out.println(ch5); // 中
            
                // 面试题
                char ch6 = '2'+2;
                System.out.println(ch6); // '4'--->4
        }
}

编码和字符集

编码是信息从一种形式或格式转化为另一种格式的过程,解码是编码的逆过程。

由权威机构形成的编码表才可以称之为字符集。

  • ASCII:英文字符集,用1个字节的7位表示。
  • IOS8859-1:西欧字符集,用1个字节的8位表示。
  • GB2312:简体中文字符集,最多使用2个字节编码。GB2312兼容了ASCII中的字符。
  • GBK:GB2312的升级,加入了繁体字,最多使用2个字节编码。1个字节的首位如果为0,则代表这个字节已经可以表示一个字符(兼容的ASCII只需7位),如果为1,则代表要加上后面的字节才能完整表示1个字符。
  • Unicode:国际通用字符集,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。有三种编码方案:UTF-8,UTF-16,UTF-32。下面以我们用得最多的UTF-8为例讲解。

JavaSE-12-1

中文“郭”字的Unicode编码为 \u90ed ,落在 00000800 - 0000FFFF 区间上,所以UTF-8编码方式为 1110xxxx 10xxxxxx 10xxxxxx 。这里的 x 填的是二进制形式。

JavaSE-12-2

所以中文“郭”字的UTF-8编码为 11101001 10000011 10101101