字符集、编码格式的理解

计算机中只能存储二进制01, 要想存储字符,就要有一个字符与编码的映射关系,这个关系就是字符集。
字符集就是字符与编码的映射关系*
字符集的发展历程:

  1. 因为计算机是欧美先发明的,他们的语言就26个字母,所以他们编制了ASCII字符集就够用了。
  2. 后来中国也引入了计算机,汉字也要在计算机中展示,然后国家编制了GB 2312字符集,这个字符集中包含了绝大部分常用的简体中文汉字。
  3. 为了兼容繁体汉字,后来国家又对GB2312进行了拓展,新推出了一个字符集GBK,GBK字符集是包含简体和繁体汉字的。
  4. 为了统一字符集,以便计算机发展,美国的出现了一个组织,这个组织推行叫做Unicode的字符集,这个字符集能够表示世界上绝大部分的字符,中文、韩文、日文、阿拉伯文等等都可以表示,也被称作“万国码”。

下面我们就来详细说一说这几个字符集。

ASCII字符集

相信只要学过计算机的,对ASCII码不陌生。

在ASCII字符集中,规定了128个字符,因此在计算机中用1个字节就能表示,每个字符有唯一的一个序号,序号从0开始到127结束,当我们要存储一个字符时,只要找到这个字符表示的序号,然后存储这个序号的二进制即可。
比如说:我们要存储a这个字符,根据ASCII字符表可以得知,a的序号是97,那97用二进制表示就是110 0001,因为ASCII需要用1个字节表示,不足8位,高位补0,因此计算机真正存储的内容是0110 0001。
将字符映射到二进制的这个过程,叫做编码
而将二进制翻译成字符的过程,叫做解码

同理:当我们查看字符时,计算机从底层取出1个字节的内容0110 0001,将这个二进制转换为十进制就是97,依照ASCII表,序号为97的字符是a,然后就将字符a展示出来了。

总结:

  • ASCII字符集用1个字节就能表示
  • ASCII只能表示英文字符以及一些常见的字符,共128个。

GBK字符集

在简体中文的Windows系统中,默认的编码集就是GBK。
GBK是兼容ASCII的,因此ASCII规则在GBK中同样适用

GBK是这样来规定的:

  • **对于ASCII字符集,在GBK中同样使用,例如a在GBK中同样是97
  • 对于汉字,要求使用2个字节来表示,第一个字节的首位必须是1(转换为十进制后是一个负数)
    为何汉字的第一个字节的首位必须是1,这是因为ASCII中所有字符的序号序号都是正数,正数的字节首位肯定是0,这样做是为了区分英文和中文。
    字节是计算机中的最小单位,所以当计算机读取一个字节的数据时,检测到这个字节的首位是0,那么就知道这是ASCII中的字符,只要这一个字节就好了。
    当读取到一个字节的首位是1时,那么就知道这个是汉字,还需要继续读取一个字节,这两个字节共同组成一个汉字。

总结

**- GBK兼容ASCII,对于ASCII字符,用1个字节来表示

  • 汉字用2个字节来表示,为了与ASCII字符区分,第一个字节的首位是1

Unicode字符集

Unicode是支持全世界大部分的字符的,因此也是目前应用最广泛的一种字符集。
Unicode同样是一张映射表,只不过这张表是非常非常大,是完全兼容ASCII的,a的序号同样是97。

但是Unicode的编码方案是不唯一的,对于用几个字节来存储有不同的方案,最先提出的一种编码方案是UTF-16,UTF的全称是Unicode Transfer Format(Unicode字符集转换方式)。可以认为UTF是Unicode的实现方式

  • UTF-16规定用2~4个字节表示一个字符
  • UTF-32规定用固定4个字节来表示一个字符
  • UTF-8规定用1~4个字节来表示一个字符,目前最广泛的解决方案。
    由于UTF-16和UTF-32实现的方式有些浪费,因此目前大部分都是用UTF-8的编码格式。
    注意:UTF-8不是字符集,而是一种编码格式,是Unicode的一种解决方案。

UTF-8的编码规则:

  • 对于ASCII中的字符,使用1个字节来表示
  • 一些小众的语言,用2个字节表示,例如拉丁文、阿拉伯文等
  • 汉字使用3个字节来表示,其实中日韩的文字都是3个字节
  • 其他非常非常小众的语言,就用4个字节来表示
    只需要知道在UTF-8编码格式下,ASCII字符用1个字节来表示,汉字用3个字节来表示

不同字节的编码方案:

除了ASCII的字符编码的一个字节是整数外,其他的每个字节都是负数,这样做的目的是用来识别几个字符才是一个完整的字符

总结

  • Unicode字符集兼容目前大部分的字符
  • Unciode字符集的编解码有不同的方案,目前主流的是UTF-8编码格式
  • UTF-8编码格式下,ASCII字符是1个字节,一个汉字是3个字节
posted @ 2023-10-06 18:53  秋天Code  阅读(18)  评论(0编辑  收藏  举报  来源