字符在计算机中的存储

在计算机中提供给用户最常见的显示就是字符,也称之为文本,字符的种类非常多,每种语言都有自己的字符集,那么,这么多的字符,如何存储进计算机中呢?

本文为你揭晓英文字符、中文字符、以及全世界所有字符在计算机中的存储。

一、字符存储的本质

每个字符都通过字符集的映射转化为一个整数存储在计算机中,所以存储字符的本质还是存储整数

那么,如何确定一个字符对应的整数是多少呢?

二、英文字符集 —— ASCII

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定,这一规定被称为 ASCII 码,ASCII 全称American Standard Code for Information Interchange,即“美国信息交换标准代码”。

ASCII 码规定使用一个字节来存储英文字符,最前面的一位统一规定为0,不同的字符由后面的7位确定, 所以ASCII码一共规定了128个字符的编码,其中包括:

  • 96个可打印字符
    • 大写英文字符和小写英文字符
    • 阿拉伯数字
    • 标点符号
    • 特殊符号
  • 32个不可打印的控制符号

关于ASCII码中规定的所有字符,请参考:完整的ASCII码对照表以及各个字符的解释

三、中文字符集

中华文明源远流长,目前汉字大约有十万个,常用的汉字都有几千个,这么多的字符,显然靠美国的ASCII码字符集是不可能存储的。

GB2312字符集

1980年中国国家标准总局制定了最早的汉字字符集 —— GB21312,全称“信息交换用汉字编码字符集”,用于汉字处理、汉字通信等系统之间的信息交换,共收入汉字6763个和非汉字图形字符682个。

GB2312基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率,但是由于中文的复杂性,特别是因为人名、地名中包含的很多字GB2312中都没有,这样导致GB2312已经越来越不能适应需要了。

因为GB2312的这些问题,国家标准化委员会又制定了GB13000,GB13000制定的原则与GB2312不同,GB13000以国际化为目标,该标准编码参照了Unicode 2.0 标准编码,与GB2312完全不兼容,因早期的计算机中的汉字采用了GB2312,无法顺利向GB13000过渡,所以GB13000变成了一个纸面上的标准,无法推广。

GBK字符集

因为GB13000的失败,国家标准化委员于1995年颁布了GBK标准,全称“汉字编码扩展规范”,GBK兼容GB2312标准,同时在GB2312标准的基础上扩展了GB13000包含的字,但编码不同。

GBK标准中收录了2万多汉字及符号,因其最早被WINDOWS采用,所以其应用范围非常广。

四、全世界的字符集 —— Unicode

正如开篇所说,全世界的语言非常多,每种语言都有自己的字符集,非常的不方便,并且极其容易出现乱码,所以Unicode字符集的诞生就是为了将世界上所有的字符都纳入其中,形成一种统一的编码规定。Unicode目前容纳了100多万个符号,每个符号的编码是唯一的,具体的符号对应表,可以查询Unicode联盟

但是需要注意,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,也就是说,在Unicode中一个个符号的表示至少需要2个字节,在表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这样就引发了一个大的问题:计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?

这个问题导致在很长的时间内Unicode并没有普及,各个国家依然使用自己的字符编码集。

五、UTF-8

在互联网出现后,强烈的需要全世界都使用一种统一的字符编码标准,在这个强大需求的推动下,Unicode编码存储方式的问题被UTF-8解决了

UTF-8是一种变长的编码方式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,而Unicode字符集的问题刚好在于字符编码的长度一直在变化,这简直是天作之合,Unicode字符集 + UTF-8编码方式迅速普及开来。

UTF-8的编码规则如下:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英文字符,UTF-8 编码和 ASCII 码是相同的。

  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Unicode符号范围(十六进制) UTF-8编码方式(二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

eg.

'王'的 Unicode编码 是\u738b(0111 0011 1000 1011),根据上表,可以发现738b处在第三行的范围内(0000 0800 - 0000 FFFF),因此的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/108545825