计算机刚诞生时,只能显示数字,但我们现在可以在互联网上看到各个国家的文字,甚至各种象形符号,但计算机只认识0和1,这到底是怎么做到的?
计算机基本计量单位
bit
位,数据存储的最小单位。在计算机中的二进制数系统中,简记为b
,也称为比特。每个0或1就是一个位(bit)。“0”是低电平,“1”是高电平,恰好代表了电路的两种状态。
byte
字节,简记为B
,是字符构成的最小单位,1byte=8bit。历史上字节长度曾基于硬件为1-48比特不等,最初通常使用6比特或9比特为一字节。今日事实标准以8比特作为一字节。
编码表
计算机只认识0和1,8个0或1组成一个字节,字节再组成字符,那么计算机就可以通过0和1表示各种字符了。字节到字符这个过程叫做编码——把1个字节或多个字节映射成一个字符。编码本来很简单,设定一个编码规则就可以,但由于各个国家的语言不同和历史的原因,当今存在很多种不同的编码规则
ASCII[1]
American Standard Code for Information Interchange,美国信息交换标准代码,使用的是计算机在美国发明的时候使用的编码表——ASCII码表。用一个字节的7位就可以表示,也就是能表示128个字符,对于只有26个字母的英语来说也够用了。
IOS-8859-1[2]
当计算机传到欧洲时,欧洲所有语言显然不止26个字母,ASCII这套编码规则是不适用了。所以采用了编码规则,又名拉丁码表。IOS-8859-1也是单字节编码,而且对ASCII向下兼容,也就是说,拓展了ASCII没有利用的那1位,能表示256个字符。
GB2312和GBK
后来计算机来到中国,中华文化博大精深,汉字怎么也得有几万个吧,之前的ASCII和IOS-8859-1都是单字节编码,单字节8位一共才能表示256个字符,显然不够用。所以中国国家标准总局1980年发布了信息交换用汉字编码字符集——GB2312,GB2312是用双字节编码,两个字节16位可以表示65536个字符。后来全国信息技术标准化技术委员会制订了汉字内码扩展规范——GBK,对GB2312进行了一次向下兼容的升级。同时GB2312和GBK也兼容ASCII,所以英文永远不会产生乱码。
Unicode
Unicode又称统一码,它对世界上大部分的文字系统进行了整理、编码。需要注意的是,Unicode只是一个用来映射字符和数字的标准。它对支持字符的数量没有限制,也不要求字符必须占两个、三个或者其它任意数量的字节。
Unicode的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为 Unicode转换格式(Unicode Transformation Format,简称为 UTF)。Unicode有多种实现方式,UTF-32、UTF-16、UTF-8等,其中UTF-8是最常用的一种。
UTF-8是一种可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。关于UTF-8的编码规则可以看这里