小伙伴们,你们好呀!我是老寇!

我们都知道计算机只能理解二进制码,一个二进制位(bit)只有0或1两种状态,而一个字节(byte)由8个二进制位组成,因此有256种组合,即00000000 ~ 111111111。

ASCII编码是美国制定的一套字符编码,对英文的字符和二进制位之间的关系,做了统一规定,沿用至今。

ASCII编码一共规定了128个字符,包括阿拉伯数字、大小写字母、其他字符(空格、换行.....)

  • 48~57为0到9十个阿拉伯数字: '0'~'9'
  • 65~90为26个大写英文字母 :'A'~'Z'
  • 97~122号为26个小写英文字母:'a'~'z'

之所以只有128个字符,是因为最前面的一位统一规定为 0

如果是使用英语是没有问题,但是欧洲的一些不使用英语的国家,却发现128个字符不够用,又扩展了一些字符,加入一些带重音的字符、希腊字母等等字符加进去,由原本 0 最高位改成 1

拓展出来了128个二进制数,即10000000 ~ 111111111,从而涵盖基本的西欧语言。

说到这里,厉害啦我的国,中国NB!

随着使用计算机的国家越来越多,ascii编码不能满足我们汉语的需要,需要扩展字符集,因此国家标准总局发布了一套国家标准,也就是gb2312(简体中文),后面又加入了生僻字、繁体字等等,就有了后面的gbk字符集。gbk又是向下兼容gb2312。

每个国家都有一套自己的编码系统,通过编码和解码出来的字符五花八门,出现了乱码的情况,因此,为了实现跨语言、跨平台的文本转换和处理需求,ISO国际标准化组织提出了Unicode的新标准,Unicode字符集涵盖了世界上所有的文字和符号字符,Unicode编码为字符集中的每一个字符指定了唯一的二进制编码,彻底解决之前不同编码系统的冲突和乱码问题。

我们一起看个程序

public class Ascii {
    public static void main(String[] args) {
        char c = 23495;
        System.out.println("Unicode编码:" + c);
        char chinese = '寇';
        int number = chinese;
        System.out.println("中文的Unicode码:" + number);
        char upper = 'A';
        number = upper;
        System.out.println("大写字母的ASCII码:" + number);
        char lower = 'a';
        number = lower;
        System.out.println("小写字母的ASCII码:" + number);
        char num = '0';
        number = num;
        System.out.println("数字的ASCII码:" + number);
        System.out.println("Unicode码为23495,强制类型转换为" + (char)23495);
        System.out.println("ASCII码为65,强制类型转换为" + (char)65);
        System.out.println("ASCII码为97,强制类型转换为" + (char)97);
        System.out.println("ASCII码为48,强制类型转换为" + (char)48);
        //char向上兼容int,因此'c'和'a'会转成int再进行计算
        System.out.println("'c'减去'a':" + ('c' - 'a'));
    }
}

Unicode编码:寇
中文的Unicode码:23495
大写字母的ASCII码:65
小写字母的ASCII码:97
数字的ASCII码:48
Unicode码为23495,强制类型转换为寇
ASCII码为65,强制类型转换为A
ASCII码为97,强制类型转换为a
ASCII码为48,强制类型转换为0
'c'减去'a':2

运行结果分析:每个字符都有唯一对应的编码值,而char转换为int类型,不需要强制类型转换,而int转为char需要强制类型转换。

byte 取值范围:-2^8 ~ 2^8-1,即 -128 ~ 127

char 取值范围: 0 ~ 65535

int  取值范围:  -2^31 ~ 2^31-1,即 -2147483648 ~ 2147483647

=> int > char,因此char能够向上兼容int,但是int要强制类型转换为char。

说到这里,你们可能就有疑问啦,为什么char可以存汉字?这是因为char是按照字符存储的,不管英文还是中文,固定占用占用2个字节,用来储存Unicode字符。范围在0~65536。

c语言说的char类型与我们java的byte类型是一致的

补充:char是有16个二进制位,2个字节,希望大家不要与c语言的char类型弄混淆啦

结论:如果是做算法题并且只有字母的情况下,完全没有必要开辟256,这样做会造成资源浪费,通过减'a'的方式,将数组长度缩小到26

技巧:求重复数字可以通过arr[i]++方式来做,arr[i]++  => arr[i] = arr[i] + 1,arr[i]能够充当临时变量