ASCII、GB2312和Unicode

  ASCII是用来表示英文字符的一种编码规范(编码规范确定了字符到编码的映 射),它一共可以表示256种不同的编码,每个编码存储起来占一个字节。其中低128个编码用来表示大小写字母、数字、控制字符等,而高128个编码则被 称做“扩展ASCII”(最高位为1),一般用来存放英文的制表符、部分音标字符等等的一些其他符号。

  早先的汉字编码就利用了扩展ASCII,它们利用两个ASCII码来编码一个汉字。由于历史的原因,在Unicode之前,一共存在过3套中文编码标准:

  GB2312-80,是中国大陆使用的国家标准,其中一共编码了6763个常用简体汉字。Big5,是台湾使用的编码标准,编码了台湾使用的繁体汉字,大概有8千多个。HKSCS,是中国香港使用的编码标准,字体也是繁体,但跟Big5有所不同。 

  这3套编码标准都采用了两个扩展ASCII的方法,但是这几套编码互不兼容,而且编码区间也各有不同。因此在同一个系统中同时显示GB和Big5基本上是不可能的。

  后来,由于各方面的原因,国际上又制定了针对中文的统一字符集GBK和GB18030,其中GBK已经在Windows、Linux等多种操作系统中被实现。 

  GBK兼容GB2312,并增加了大量不常用汉字,还加入了几乎所有的Big5中的繁体汉字。但是GBK中的繁体汉字和Big5中的几乎不兼容。 

  GB18030相当于是GBK的超集,比GBK包含的字符更多。据我所知目前还没有操作系统直接支持GB18030。

  这之后,Unicode出现了,在Windows2K,XP中,Unicode已经成了OS的标准内码。

  Unicode编码规范有两套标准,一套叫UCS-2(Unicode-16),另一套叫UCS-4(Unicode-32)。

  以目前常用的UCS-2为例,它可以表示的字符数为2^16=65535(编码数),基本上可以容纳所有的欧美字符和绝大部分的亚洲字符 。

  在Unicode里,所有的字符被一视同仁。汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了。

  但是,这个世界不是理想的,不可能在一夜之间所有的系统都使用Unicode来处理字符,所以Unicode在诞生之日,就必须考虑一个严峻的问 题:和ASCII字符集之间的不兼容问题。我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65。而“A”的Unicode是0065, 这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了 。 

  另一个更加严重的问题是,C语言使用'/0'(ASCII码0)作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉。

  UTF(UCS Transformation Format)是将Unicode编码规范和计算机中实际存储的编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16 。 

  其中UTF-16和上面提到的Unicode编码规范本身是一致的,这里不多说了。而UTF-8不同,UTF-8有点类似于Haffman编码,它用 1-6个字节来存储一个编码,其中英文字符仍然跟ASCII编码一样,用一个字节来存储,因此原先的函数库可以继续使用。而中文的编码范围是在 0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的),用专门的Unicode处理类可以对UTF编码进行处理。 这种规则可以和ASCII编码保持最大程度的兼容。

猜你喜欢

转载自blog.csdn.net/neonlight/article/details/5976531
今日推荐