理解计算机字符编码

字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。说通俗点就是把你能看得懂的字符(字母、符号等)变成计算机能够读懂的一种形式。

ASCII字符集

谈到ASCII,肯定很多人都很眼熟,在《C Primer Plus》的封面后面就印着有这样的ASCII字符集的对照表。

ASCII全称American Standard Code for Information Interchange(美国信息交换标准代码),是由ASNI(美国国家标准学会)制定的一套单字节字符编码方案。供不同计算机在互相通信时用作共同遵守的字符编码标准,被ISO(国际标准化组织)定为国际标准,一直沿用至今。

ASCII字符集包括了控制字符(回车键、退格、换行等)以及各种可显示的字符。

ASCII编码就是将ASCII字符集转换为计算机可以读懂的(二进制,0和1)的一套规则。

1个字节(byte)=8个二进制位(bit),而1个bit可以是0和1两个状态,所以一个字节(byte)就可以有256种状态。如图是用十进制(DEC)对比的字符集。

虽然ASCII如今被广泛采用,但是因为其只能显示26个拉丁字母、阿拉伯数字和半角标点符号,因此它最多只能用于显示现代美国英语。而像世界上很多国家或地区都有其特定的文字和书写方式,例如法语、俄文以及我们中国的汉字还包括简体和繁体等等,用ASCII表示肯定是不够的,所以当时就有对于特定地区所使用的特定的字符编码,例如我们中国的GBK字符集(GBK2312)就包含有20000个以上的简体汉字,但这还是远远不够的,要知道汉字的数量将近十万字。

Unicode

为了解决上述一难题,由ISO制定的Unicode标准就诞生了。Unicode又称统一码,万国码,包括字符集、编码方案等,其中包括了世界上所有的一切可表示的符号,是一个非常庞大的字符集。但是它并不是一套完善的字符编码,譬如说,一个汉字可能需要2-3个字节来表示,这是可以接受的,但是一个字母,有可能仅需一个字节就能表示,这造成了一种资源浪费。

UTF-8

为了解决上述的,不同的字符使用Unicode来表示所占字节数的巨大不同,UTF-8字符编码就诞生了。UTF-8可以用1-4个字节来表示一个任何一个Unicode字符(UTF-32用4个字符、UTF-16用2-4个字符),UTF-8用于不同的字符所需的字节数:

  • 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
  • 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
  • 其他极少使用的Unicode辅助平面的字符使用四字节编码。

这就是为什么现如今所有的数据储存方案或者是表示‘、各种网页、信息都会采用UTF-8来编码的原因,它不会像UTF-32那样,无论什么字符都会用4个字节来表示,也不会像传统的ASCII那样,只能表示128个字符,也不会像GBK那样,只能用于某个地区。