前言
小伙伴们,你们好呀!我是老寇!
我们都知道计算机只能理解二进制码,一个二进制位(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]能够充当临时变量