java基础-ascii编码

简介: java基础-ascii编码

前言


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


我们都知道计算机只能理解二进制码,一个二进制位(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]能够充当临时变量


目录
相关文章
|
3月前
|
存储 Java
最新Java基础系列课程--Day10-IO流文件处理(一)
最新Java基础系列课程--Day10-IO流文件处理
|
3月前
|
存储 Java Android开发
IO流:java中解码和编码出现乱码说明及代码实现
IO流:java中解码和编码出现乱码说明及代码实现
|
4月前
|
存储 缓存 Java
最新Java基础系列课程--Day10-IO流文件处理
最新Java基础系列课程--Day10-IO流文件处理
|
6月前
|
存储 Java
使用Java进行Base64编码的示例
使用Java进行Base64编码的示例
68 1
|
5月前
|
Kubernetes 数据可视化 搜索推荐
学习Java 8 Stream,提升编码能力!
学习Java 8 Stream,提升编码能力!
|
14天前
|
Java API
编码的奇迹:Java 21引入有序集合,数据结构再进化
编码的奇迹:Java 21引入有序集合,数据结构再进化
16 0
|
14天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
13 0
|
24天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
24 4
|
2月前
|
Java Maven
java获取文件编码,jsoup获取html纯文本
java获取文件编码,jsoup获取html纯文本
13 0
|
2月前
|
缓存 分布式计算 Java
Java基础深化和提高-------IO流
Java基础深化和提高-------IO流
108 0