红旗红旗红旗红旗LinuxLinuxLinuxLinux中文操作系统技术白皮书中文操作系统技术白皮书中文操作系统技术白皮书中文操作系统技术白皮书中文平台技术中文平台技术中文平台技术中文平台技术中科红旗软件技术有限公司中科红旗软件技术有限公司中科红旗软件技术有限公司中科红旗软件技术有限公司二二二二年六月年六月年六月年六月第第第第1111章章章章炎黄炎黄炎黄炎黄中文平台结构中文平台结构中文平台结构中文平台结构1.11.11.11.1设计目标设计目标设计目标设计目标在UNIX系统(Linux亦如此)中一般都提供了支持国际化本地化的NLS(NationalLanguageSupport)子系统如图1-1所示NLS子系统是建筑在基于ASCII码的UNIX核心上为世界上不同地域不同语言环境的应用提供国际化本地化支持在此基础上可以建立支持各种不同的语言文化的民族特征数据库(LOCALE)输入方法(IM)字体(FONT)和消息机制(MESSAGE)等[1]NLS子系统是UNIX/Linux实现国际化本地化的基础系统中所有支持多国语言的实用程序包括XWindow都是建立在这个基础上当然并不是没有NLS子系统的支持就不能进行在UNIX/Linux系统上开发本地语言(如中文)处理环境但是开发的工作量要比有NLS支持大得多而且兼容性和可移植性差实际使用效果也要差一些例如在XWindow上利用NLS机制实现本地化时只要配置好中文显示字库在进入中文本地环境之后绝大多数X应用程序就可以显示中文信息而且不会出现半个汉字问题这时要开发的只是中文输入方法但是如果没有NLS支持还必须开发中文显示部分而且很难保证不出现半个汉字问题在整个NLS子系统中与代码集相关的多字节字符与宽字符处理函数则是UNIX/Linux实用程序支持国际化本地化的核心通过这些函数实用程序把英文与各种本地文字同样处理这一特性对于中文等多字节文字尤为重要实用程序(如vishawk等)使用这些函数就可以对汉字进行整字处理(增删改光标移动等)不会出现半个汉字问题但是前提是必须在中文locale的支持下进行操作否则这些函数并不起作用如果没有NLS的支持要想让系统中的实用程序支持汉字的整字操作就必须实用程序内部进行处理工作量大而且效果也很难保证在一些UNIX中文平台产品中由于开发人员缺乏对UNIX国际化本地化技术的了解在中文平台上并没有采用SCOOpenServer系统已经提供的NLS支持因此为了能使vi能够不出现半个汉字问题不得另行开发了一个cvi浪费了人力物力而且虽然有些产品为用户提供了中文的消息处理但是由于没有采用国际化本地化的实现方法在中英文消息切换时不得不采取复制整个消息目录方法实现效率很低并且无法实现消息与平台环境同步改变(即在中文环境下使用中文消息在英文环境下使用英文消息)对于运行在PC和PC服务器上的Linux系统还有一个需要特别注意的特点是PC或PC服务器有一个需要特殊处理的主控台作为一个完整的中文平台解决方案必须提供对主控台的中文支持事实上这部分也占整个中文平台中工作量较大的部分在详细分析了目前市场上的Linux中文平台的功能及技术特点基础上根据UNIX系统国际化本地化技术以及中文平台技术的现状和发展趋势我们在炎黄中文平台的设计中着重解决了以下几个问题1)1)1)1)标准化问题标准化问题标准化问题标准化问题UNIX系统在其几十年的发展中已经形成了一系列为产业广泛接受并遵循的国际标准和工业标准(如PosixXPG/4SPEC'95等)其中包括了有关国际化本地化的内容许多国外公司如IBMSUNSCO都遵循这些标准开发了一批支持不同语言(如德文法文日文中文等)的本地化环境我国台湾地区的一些公司(如大同)也依据这些标准开发了繁体中文环境而在大陆由于多数软件开发商对此并不了解也不够重视因此除个别厂商外绝大多数Linux文平台产品都是以解决基本汉字处理(输入显示打印)为目标孤立地对系统中不能处理汉字的地方(如主控台XWindowvish等)进行扩充改造自成体系这样的中文平台不仅使得原英文系统中支持本地化的功能无法发挥作用加大了开发的工作量而且中文平台之间的兼容性差与其它本地区环境很难同时工作针对这种情况我国制定了开发系统中文API界面规范(GB/T16681-1996)[2]希望能有效地规范各厂商UNIX系统中文平台的开发作为GB/T16681-1996的起草单位之一我们在开发中遵循了这些标准在解决中文平台标准化规范化上下了工夫2)2)2)2)版本无关性问题版本无关性问题版本无关性问题版本无关性问题由于目前的中文平台是架构应已有的英文系统上的而在核心内部实现相对比较困难开发的工作量也较大而且由于在核心内部实现与原系统的依赖关系十分紧密因此一旦原系统版本发生变化则中文平台往往要在新的英文版本上重新开发对于人力物力都是浪费再者在系统核心内部实现中文平台其灵活性稳定性都难于保证采用外挂式技术可以较为有效地解决上述问题3)3)3)3)对于英文软件对于英文软件对于英文软件对于英文软件的兼容性的兼容性的兼容性的兼容性由于Linux系统上的应用软件众多这些软件中有一些并未按国际化的方法进行设计这就给支持英文外的语言环境带来了一定的困难但是一个好的本地平台应该有能力在这样的软件上输入/输出汉字(当然软件本身必须能支持8位操作)4)4)4)4)支持支持支持支持CJKCJKCJKCJK大字符集大字符集大字符集大字符集随着计算机应用的不断深入计算机网络的进一步普及GB2312-80标准中的6763个汉字已越来越不能满足用户的应用需要因此作为新开发的中文平台应能够满足用户对汉字日益增长的需求不仅应该支持ISO10646.1/GB13000.1标准中的CJK汉字而且还应为进一步支持更大的汉字字符集预留必要的接口5)5)5)5)多内码功能多内码功能多内码功能多内码功能近几年来海峡两岸交流日益频繁及香港回归有大量的中文电子信息需要在两岸及港澳地区相互交换使用由于大陆和台港澳地区的汉字标准内码结构不同造成了同文同字不同码的局面过去的中文平台一般只能支持一种内码要使用另一种内码往往必须重新启动另一个中文平台这给用户带来很多不便如何在同一个平台上处理多种不同的内码如GBGBKUTF-8Big5等是在实现中需要研究的问题6)6)6)6)具具具具有良好的用户界面有良好的用户界面有良好的用户界面有良好的用户界面易于使用与维护易于使用与维护易于使用与维护易于使用与维护目前Windows图形用户界面以其简单明了易学易用的特点迅速被众多用户所接受而Linux系统除工作站和PC主控台上具有XWindow图形界面外其它还是以字符界面为主为了使用户更易于接受使用与维护中文平台应提供更好的用户界面就中文平台的输入法而言Windows上已有一批由于全国信标委推荐易学易用的中文输入法如智能ABC表形码郑码等在Linux中文平台尚无对非专业录入人员十分易学易用的输入法在我们的平台上结束了这种局面1.21.21.21.2模块结模块结模块结模块结构构构构由于目前的Linux系统核心及各种外部设备是基于ASCII的因此字符数据在进出系统核心及在设备上进行输入输出时使用的都是文件码即多字节字符串只有在应用程序需要时才通过NLS库中代码集相关的多字节字符与宽字符转换函数文件码将转换成处理码供应用程序使用其代码流见图1-2显然要在这样的系统上实现支持ISO10646大字符集的中文平台只能采用在基于字节处理的Linux核心基础上用某种内码(文件码)形式如UTF-8GBK来存储传输和输入输出ISO10646编码同时为应用程序提供一组文件码和处理码互相转换的函数应用程序可以使用这组函数在其内部对ISO10646编码进行处理运行在PC及PC服务器上的Linux系统除了可以配接终端外在其主控台上还提供了字符和图形(基于XWindow)两套用户界面因此PC及PC服务器上的Linux系统中文平台至少应包括中文字符界面中文图形界面中文打印输出子系统三个相对独立的组成部分根据上述分析和平台所要达到的设计目标(见1.1节)我们把炎黄中文平台划分为由十余个模块组成的五个子系统即中文字符界面中文图形界面中文打印输出跨平台输入方法子系统和跨平台高品质字形服务子系统各子系统和模块关系如图1-3所示其主要功能为汉字终端仿真程序在主控台字符界面上提供汉字终端的功能使得主控台字符界面成为一个功能齐全的汉字终端字符界面显示模块为字符界面提供与系统版本无关的汉字显示功能字符界面输入模块为字符界面提供汉字输入功能图形界面输入服务器与XFont服务器作为XServer的扩充为基于XWindow的应用程序提供汉字输入与显示功能中文打印输出程序为整个系统提供与打印机无关的高品质的汉字打印输出服务本地化环境包括locale数据库和本地化函数库两部分给整个系统提供了与本地语言(汉字)文化特性有关的描述信息和函数库不仅主控台汉字界面可以使用该模块而且用户还可以通过汉字终端使用该模块跨平台输入方法服务器可以为不同的系统平台提供汉字输入服务该服务器可以与上面各模块在同一系统上也可以在不同的系统上通过TCP/IP网络来请求服务器提供具体的输入服务输入法1~n模块提供各种具体的输入法(如拼音智能ABC等)处理跨平台TrueType字形服务器可以为不同的系统平台提供汉字字形输出服务该服务器将汉字TrueType字形的还原(光栅化)处理将其还原成汉字点阵信息它可以与上面各模块在同一系统上也可以在不同的系统上通过TCP/IP网络来提供服务在下一章中将详细讨论各个模块的具体实现算法与结构第第第第2222章章章章具体实现具体实现具体实现具体实现本章将讨论炎黄中文平台的各个模块在实现时采用的具体结构和算法2.12.12.12.1内码选择内码选择内码选择内码选择在炎黄中文平台中支持ISO10646标准CJK汉字字符集和汉字多内码(GBGBKUTF-8和Big5)是两个重要的设计目标为了达到这一目标就必须为该平台选择一个宽阔简洁高效实用的内码作为平台的基本内码对其它内码的支持则在此基础上进行扩充显然这个内码必须能够支持ISO10646标准CJK汉字字符集从理论上讲UTF-8代码是比较好的选择因为UTF-8不仅可以表示CJK汉字也可以表示ISO10646标准中的其它文字与符号而且有很好的可扩展性可以表示CJKExtensionA和B中的汉字但是从目前实用的角度上看由于UTF-8与现在广泛使用的GB和GBK内码不兼容因此在绝大多数应用时必须不断进行UTF-8与GB/GBK之间的代码转换影响整个系统的效率根据上述考虑我们认为使用GBK代码作为炎黄平台的基本内码是比较实用的这样既可以与现行的GB内码兼容与其它支持GBK内码体系的软硬件产品(如Windows95等)兼容又可以覆盖ISO10646标准CJK汉字字符集和Big5代码的符号通过必要的代码映射支持Big5和UTF-8代码在处理码的选择上考虑到GBK是UCS-4中CJK汉字的一种表示形式二者之间的转换是基于映射表的一一对应的映射处理简便直观因此我们采用了UCS-4代码作为处理码2.22.22.22.2本地化环境本地化环境本地化环境本地化环境在确定了炎黄平台的基本内码后就要建立基于该内码体系的本地化环境本地化环境分为locale数据库和本地化函数库两部分是开放系统进行本地化的基础2.2.12.2.12.2.12.2.1本地化函数库的扩充本地化函数库的扩充本地化函数库的扩充本地化函数库的扩充由于炎黄平台采用GBK为基本内码(多字节文件码)而目前Linux系统的NLS子系统的本地化函数库只能支持EUC和UTF-8内码体系并不支持GBK内码体系在这样的系统上开发炎黄平台就必须扩充现有的NLS子系统的本地化函数库要扩充NLS子系统可以采用两种不同的方案一是为支持GBK开发一组符合POSIXXPG4和ANSIC标准和规范的函数和命令二是扩充现有NLS函数和命令使之具有支持GBK的能力同时保持现有NLS支持EUC和UTF-8内码体系的功能和界面综合比较以上方案我们认为前者存在明显的缺陷由于系