日期:2014-05-17  浏览次数:20837 次

Windows程式开发设计指南--Unicode简介

2. Unicode简介

在第一章中,我已经预告,C语言中在Microsoft Windows程式设计中扮演著重要角色的任何部分都会讲述到,您也许在传统文字模式程式设计中还尚未遇到过这些问题。宽字元集和Unicode差不多就是这样的问题。

简单地说,Unicode扩展自ASCII字元集。在严格的ASCII中,每个字元用7位元表示,或者电脑上普遍使用的每字元有8位元宽;而Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。考虑到ASCII是电脑中最具支配地位的标准,所以这的确是一个很高的目标。

Unicode影响到了电脑工业的每个部分,但也许会对作业系统和程式设计语言的影响最大。从这方面来看,我们已经上路了。Windows NT从底层支援Unicode(不幸的是,Windows 98只是小部分支援Unicode)。先天即被ANSI束缚的C程式设计语言通过对宽字元集的支援来支援Unicode。下面将详细讨论这些内容。

自然,作为程式写作者,我们通常会面对许多繁重的工作。我已试图透过使本书中的所有程式「Unicode化」来减轻负担。其含义会随著本章对Unicode的讨论而清晰起来。

字元集简史
 

虽然不能确定人类开始讲话的时间,但书写已有大约6000年的历史了。实际上,早期书写的内容是象形文字。每个字元都对应於发声的字母表则出现於大约3000年前。虽然人们过去使用的多种书写语言都用得好好的,但19世纪的几个发明者还是看到了更多的需求。Samuel F. B. Morse在1838年到1854年间发明了电报,当时他还发明了一种电报上使用的代码。字母表中的每个字元对应於一系列短的和长的脉冲(点和破折号)。虽然其中大小写字母之间没有区别,但数字和标点符号都有了自己的代码。

Morse代码并不是以其他图画的或印刷的象形文字来代表书写语言的第一个例子。1821年到1824年之间,年轻的Louis Braille受到在夜间读写资讯的军用系统的启发,发明了一种代码,它用纸上突起的点作为代码来帮助盲人阅读。Braille代码实际上是一种6位元代码,它把字元、常用字母组合、常用单字和标点进行编码。一个特殊的escape代码表示後续的字元代码应解释为大写。一个特殊的shift代码允许後续代码被解释为数字。

Telex代码,包括Baudot (以一个法国工程师命名,该工程师死于1903年)以及一种被称为CCITT #2的代码(1931年被标准化),都是包括字元和数字的5位元代码。

美国标准
 

早期电脑的字元码是从Hollerith卡片(号称不能被折叠、卷曲或毁伤)发展而来的,该卡片由Herman Hollerith发明并首次在1890年的美国人口普查中使用。6位元字元码系统BCDIC(Binary-Coded Decimal Interchange Code:二进位编码十进位交换编码)源自Hollerith代码,在60年代逐步扩展为8位元EBCDIC,并一直是IBM大型主机的标准,但没使用在其他地方。

美国资讯交换标准码(ASCII:American Standard Code for Information Interchange)起始於50年代後期,最後完成於1967年。开发ASCII的过程中,在字元长度是6位元、7位元还是8位元的问题上产生了很大的争议。从可靠性的观点来看不应使用替换字元,因此ASCII不能是6位元编码,但由於费用的原因也排除了8位元版本的方案(当时每位元的储存空间成本仍很昂贵)。这样,最终的字元码就有26个小写字母、26个大写字母、10个数字、32个符号、33个代号和一个空格,总共128个字元码。ASCII现在记录在ANSI X3.4-1986字元集-用於资讯交换的7位元美国国家标准码(7-Bit ASCII:7-Bit American National Standard Code for Information Interchange),由美国国家标准协会(American National Standards Institute)发布。图2-1中所示的ASCII字元码与ANSI文件中的格式相似。

ASCII有许多优点。例如,26个字母代码是连续的(在EBCDIC代码中就不是这样的);大写字母和小写字母可通过改变一位元资料而相互转化;10个数位的代码可从数值本身方便地得到(在BCDIC代码中,字元「0」的编码在字元「9」的後面!)

最棒的是,ASCII是一个非常可靠的标准。在键盘、视讯显示卡、系统硬体、印表机、字体档案、作业系统和Internet上,其他标准都不如ASCII码流行而且根深蒂固。

       0-     1-     2-     3-     4-     5-     6-     7-
-0     NUL    DLE    SP     0      @      P      `      p
-1     SOH    DC1    !      1      A      Q      a      q
-2     STX    DC2    "      2      B      R      b      r
-3     ETX    DC3    #      3      C      S      c      s
-4     EOT    DC4    $      4      D