编码器的演变(ASCII、GBK、Unicode、UTF-8)

1,210 阅读5分钟

编码器的浅显认知

对于Java开发,对于字符串处理都是UTF-8进行编解码,其他的编码方式可能没怎么注意过。

源于Unicode的普及,UTF-8编码已成为互联网和多语言支持的标准编码方式,它能够更有效地支持多种语言,并且对英文字符的编码效率更高。

测试同学质疑

测试页面文本输入框长度,通过在线字数统计工具

这个页面告诉我们汉字和中文标点符号算两个字符。

image.png 上述页面的跟Java测试的结果不同,Java字符串长度默认字符串内容每个字符都是1个字符(不区分中英文)。

先解释下上面图片里面说的汉字或者中文标点符号占两个字符的意思应该是说占两个字节,为什么占两个字节,原因应该是他用的GBK编码,中文占2个字节。

字节和字符对比

定义

  • 字节:是计算机存储的基本单位,通常情况下,一个字节由8位(bit)组成。位是计算机存储的最小单位,代表一个二进制数字,即0或1。
  • 字符:是文本的基本单位,可以是字母、数字、标点符号或其他符号。字符的编码是指将字符映射到数字的过程,这样计算机就可以存储和处理文本

大小

  • 字节是固定的,8位。
  • 字符的大小取决于使用的编码系统。例如,在ASCII编码中,一个字符占1个字节;GBK中一个英文字符占1个字节,一个汉字占2个字节,UTF-8编码中,一个英文字符占1个字节,一个汉字可能占3或4个字节。

编码

  • 字节本身不包含编码信息,它只是数据的载体。
  • 字符需要通过编码来表示,不同的编码系统定义了字符到字节序列的映射方式。

总结来说,字节是物理存储的单位,而字符是通过编码系统映射到字节序列的文本单位。在处理文本数据时,字符的概念更为重要,因为它直接关系到文本的表示和解读。

编码器的演变

ASCII编码

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码),他是最通用的单字节编码系统。标准的ASCII码使用7位二进制(剩下的1位二进制为0)来表示所有的大写和小写字母,数字、标点符号,以及特殊字符。

image.png

GBK编码

由于ASCII码不支持中文,于是国人定义了一套编码规则,当字符小于127位时,与ASCII的字符相同, GBK编码使用两个字节来表示一个字符,其中第一个字节称为高字节,第二个字节称为低字节。,为了涵盖更多的中国文字,符号,繁体字,编码从GB2312到GB18030,现在通常会使用GB18030编码。随着Unicode和UTF-8编码的普及,GBK的使用逐渐减少,但在一些特定的历史遗留系统中,GBK仍然在使用。

所有GBK继承了ASCII编码。

Unicode编码

每个国家定义一套字节的编码标准,无法实现互通。出现了一个ISO的组织(国际标准化组织)决定定义一套统一的编码方案解决所有国家的编码问题。新的编码方案就是Unicode。它不是一个新的编码规则,而是一套字符集,可以理解为一本世界编码的字典。

ISO规定:每个字符必须使用两个字节,即用16位二进制表示所有的字符,对于ASCII编码表里面的字符,保持其编码不变,只是将长度拓展到16位,其他国家字符全部统一重新编码。

UTF-8编码

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一

UTF-8的特点

  • 兼容性:UTF-8完全兼容ASCII编码,ASCII字符集中的字符在UTF-8中保持单字节形式,其编码值也与ASCII相同。这意味着原来处理ASCII文本的软件无需修改即可处理UTF-8编码的文本,这一特性极大地促进了UTF-8的普及。
  • 可变长度:UTF-8使用1到4个字节编码Unicode字符,根据字符的不同选用不同长度的字节表示。这种可变长度的特性使得UTF-8既可以高效地编码英文等西欧文字,又能够表达全球所有的字符。
  • 自同步性:UTF-8编码中的每个字节都包含了信息,表明它是单独的字符还是某个字符的一部分。这意味着即使在数据流的任何位置开始解码,也可以正确地识别字符边界。
  • 节省空间:对于以英文为主的文本,UTF-8编码比其他Unicode编码方案(如UTF-16或UTF-32)更加节省空间。