深入理解ASCII,Unicode和UTF-8编码

1.为什么需要编码?

  由于计算机只能处理0和1(即两种状态:高低电平),所有我们需要将英文字母,数字,特殊符号翻译成计算机认识的0和1,那如何去翻译以及用何种规则去翻译呢,于是聪明的人们发明了一系列编码规则,即字符和数字的对应。最先被发明的是ASCII编码,后来则衍生出了Unicode编码和UTF-8编码。

2.编码格式的演变

  世界第一台计算机诞生于美国宾西法尼亚大学,所以最早使用计算机的是美国人,最早的信息交换代码也诞生于美国,即ASCII(America Standard Code for Infomation Interchange,美国信息交换标准代码)。ASCII码实质就是数字和字符的对应关系,比如大写字母"A"所对应的十进制数字为65(为了更易理解我们以十进制举例,八进制,十六进制同理),而十进制数字65在计算机中表示为01000001,计算机不能存储字符,但是能存储0和1,所以字母“A”在计算机中实际存储为01000001,占8位,即1个字节。其他字符也是同样的道理,各自对应一个十进制数字,可参考ASCII码标准对照表。是不是很简单,但是为何人们还制定Unicode编码呢?由于ASCII编码是美国标准,所涵盖的字符也只仅仅包含了A-Z,a-z,数字0-9,以及其他的控制字符和一些特殊字符,一共包含127个字符,后来由于计算机普及,这127个符号已经不能满足人们的需求,于是IBM利用128~255位对ASCII码进行了补充,包含了附加符号符号,希腊字母以及制图符号等,这一部分编码则称为扩展ASCII码。
  世界上有上百种语言,很显然,标准ASCII码和扩展ASCII码仍然不能满足不同国家对于编码的需求,比如汉字的“汉”就不能用ASCII码表示,如果在编辑器设置了ASCII编码,在遇到汉字的情景下则会出现乱码,于是中国制定了GB2312编码,日本制定了Shift_JIS编码,但是同一款应用,不同地区的人使用,就需要包含不同的编码集合,显然这样做是不明智的,于是Unicode应运而生。Unicode编码通常用2个字节表示,有些偏僻的字符会用到2-4个字节,从而实现一套编码保存所有字符,这样不同国家,不同地区就形成了一套统一的编码格式。
  还是拿字符“A”举栗子,“A”对应的ASCII码为01000001,如果将“A”用Unicode编码表示就在前面补0就可以了,0000000001000001,现在我们也可以用Unicode编码来表示“汉”了,0110110001001001。不难发现,如果用Unicode去编码所有的字符,乱码的问题也就迎刃而解,但是问题也来了,如果一段文字中,既有英文字母,又有汉字,英文字母同样也会用2个字节(16位)来进行表示,这显然会造成存储空间的浪费。那么有没有一种更加通用并且更加节省存储空间的编码呢?当然是有的,聪明的人们发明出了UTF-8编码,UTF-8是一种可变长的编码,为啥叫UTF-8呢,这个8是什么意思呢?8代表一个字节,即8位,但不代表UTF-8用一个字节表示一个字符,而是在UTF-8编码格式下,一个字符所占字节大小变化的最小单位,有点绕,说人话就是由于UTF-8编码下,不同字符占用空间的大小是可变的,每个字符可能是1个字节,也可能是2个或者3个字节。   

----- 待更新

猜你喜欢

转载自blog.csdn.net/weixin_34314962/article/details/91384919