Linux是操作系统中的一朵奇葩,是中国软件发展的机遇。要使这朵奇葩在中国的大地上生根、发芽、开花,要想抓住Linux机遇,首先必须解决中文本地化的问题。
1999年政府公开支持在中国发展Linux,国内出现了好几家制作中文Linux发布版本的公司,推动了Linux在中国的发展和普及,但在初期中文Linux都是采用中文平台的方式。
一、“中文平台”
“中文平台”是为了让计算机能处理中文信息,在操作系统上建立必要的中文处理手段,即在ASCII码的操作系统上架构一个中文处理环境,用来提供中文的输入、显示、打印和中文文件的存储、处理、传输,并为应用软件开发和运行提供支持,俗称“中文平台”。
中文平台的主要技术特点是在ASCII码的操作系统上架构一个中文处理环境。该中文处理环境为了简化字符处理而使用的处理码可能是把汉字作为一个宽字符来处理,但进出核心的代码流都采用文件码,即多字节字符,所以中文平台本质上仍是按字节处理中文。
从显示方式来讲,可分为字符界面和图形界面两种“中文化”方式。字符界面的“中文化”又可分为内核汉化和外挂式两种。内核汉化是直接修改Linux内核的源程序,使之能处理中文信息。外挂式是不修改Linux内核的源程序,在原有应用程序接口(API)之外增加一层中文信息处理的支撑平台。
图形界面的“中文化”本质上都属外挂式,但实现的方式有:
修改XFree 86、即修改X Server;
修改XWindow的库函数Lib X11.so;
利用LD-PRELOAD载入动态库。
中文平台具体实现的技术特点各不相同,充分展现了中国人的聪明才智,但也带来一些问题。
1. 没有相应的标准,使中文应用软件在多版本之间的可移植性造成困难。有可能出现在某一版本中文平台上运行的中文应用软件在另一个版本的中文平台就不能运行或不能很好运行的情况。中文应用软件开发商可能要为每一个版本的中文平台开发一个产品。这对中文应用程序的发展很不利,而应用又是Linux能否发展的一个极重要的问题。
2.中文平台实际上仍是字节处理,而不是以字符为单位来处理,可能与ASCII码造成冲突,不能彻底解决汉字与ASCII码的冲突。而且不能彻底解决汉字的输入、输出问题,比如半个汉字的问题(显示、删除半个汉字,光标半个汉字移动)。
3.中国是由56个民族组成的大家庭。中国使用汉字的人占绝大多数,中文主要是汉语,但也包括其他少数民族的语言文字。海内外华人使用的汉字有简体与繁体,日本语、朝鲜语中也有汉字。“中文平台”和“中文化”是个很不确切的说法。而且中文平台也解决不了在一个系统内使用汉字、少数民族语言、日本和朝鲜的汉字问题。
4.POSIX是操作系统的一个标准。 Linux是符合POSIX标准的。而POSIX标准是采用国际化/本地化模式来解决多国语言文字的本地化。
1999年8月底成立了Linux国际化工作组,开始了Linux国际化(缩写为Li18nux)工作,同时也为中文本地化指出了正确道路。在这之前搞中文平台,是因为那时还没有Linux国际化组织,也没有Linux国际化标准。而且Linux是芬兰人发明,在美国成长起来的,开始也没有想到它会如此成功,会走向世界,因此Linux以前也没有考虑国际化的问题。Linux中文平台对Linux在中国的发展和普及起了重要的作用,但它已完成了它的历史使命。它只是一种暂时过渡的方法,是不得已而为之的方法,并不是中文Linux发展的正确之路。
二、Linux的国际化/本地化
国际化
国际化(Internationalization,缩写为I18n,即取首尾两个字母,中间有18个字母)是规定在一个计算机程序内部的能力,使它适应不同的本地语言、本地风俗和编码字符集。
国际化标准定义一组国际化的应用程序编程界面和用户界面。
国际化主要包括用双字节/多字节编码代替单字节7位或8位编码,使用统一的大字符集ISO 10646,建立本地化数据库Locale DB,提供输入、输出服务(I/O服务)等内容。
1. 用双字节/多字节编码代替单字节7位或8位编码
在国际化标准中,系统字处理中,必须以字符为单位,而不能以字节为单位。字符既可以是单字节字符,也可以是多字节字符,所以彻底解决了半个汉字现象。
由于历史的原因,计算机为了实现不同硬件和软件系统之间数据传输的标准化,是使用7位编码的,称为ASCII(American standard code for information interchange)。ASCII是信息交换使用的美国国家标准编码,它是美国的标准。ASCII字符集是用7个数据位表示的代码,它用二进制数值来表示ASCII字符,代码值的范围在0到127之间。大部分基于PC的系统则使用八个数据位的扩展ASCII代码。这样可以使用额外的128个字符代表一些特殊符号、外语字符、图形符号。
通信软件的高位(第8位)是作为奇偶校验位,用来检测和改正通信错误。这种7位有效位的假定,渗透到很多软件中,如电子邮件的实现。
随着计算机应用的不断发展,7位编码已不够了。虽然以后又使用8位的扩展ASCII码,但256个字符即使对使用拼音文字的单文种的国家的用户也是不敷使用了。虽然用了7位或8位能覆盖基本字母,但还有多种多样的符号及印刷元素,其数量远大于256。各国拼音文字的字母和各种符号就有一万个左右,汉字则有七八万之多,使用双字节(16位)编码,也只能标识65536个符号。所以,如果想要计算机能使用多国文字,特别是使用汉字,则必须用双字节/多字节。
如果说用两位数表示年是计算机的千年虫问题,那么用单字节编码ASCII处理字符则是计算机文字处理的“千年虫”问题。但单字节编码的危害还没有引起人们足够的重视。
国际化的首要工作就是在系统字处理中,必须以字符为单位,而不是以字节为单位,即用双字节/多字节编码代替原来的单字节编码,这就是用宽字符(wide character,为了统一地处理单字节字符和多字节字符,而采用统一编码宽度的字符的内部表示)代替单字节字符。
2.使用统一的大字符集ISO 10646
使用统一的多八位大字符集ISO 10646是国际化的关键工作,也是国际化的核心工作。十分遗憾的是很多人对其重要性认识不足。
中国56个民族中使用汉字的人占绝大多数,有本民族语言的少数民族有17个。这些民族的文字属性及字量相差很大,目前对不同民族文字采用不同的编码方式。在中国使用人数最多的少数民族文字有七种:蒙古文、藏文、维吾尔文、哈萨克文、朝鲜文、彝文和壮文。其中蒙古文、哈萨克文、朝鲜文还须考虑和使用这些文字的其它国家如蒙古国、哈萨克斯坦共和国、朝鲜和韩国使用的编码一致。中文信息处理主要是汉字,但不只是汉字。它也应该而且必须包括少数民族语言的文字处理这一重要组成部分。这对加强民族团结、提高少数民族地区的经济、文化、科技发展,对于回击外国反华势力攻击中国不重视少数民族的谎言,都有十分重要的意义。为了在一个计算机系统内同时处理汉字和多种少数民族文字,就必须使用既有汉字、又有各少数民族文字的统一大字符集。
海内外华人使用的汉字有很大差异,这种差异不只是反映在简繁体和用词的不同,更重要的是编码和字符集不同,而要解决这个问题必须采用统一的大字符集。而且,国际化的要求也使得大字符集的使用更为迫切。
ISO 10646 信息技术通用多八位编码字符集(Information technology-Universal Multiple-
octet Coded Character Set,缩写为UCS)是国际标准化组织对全世界各国地区使用的书面语言文字及符号进行统一编码的编码字符集的国际标准。已于1993年5月正式审定公布了ISO 10646.1。我国根据等同采用国际标准的原则,也于1993年12月宣布为国家标准GB13000.1。
目前,该标准已收入了各国现行标准的文字符号近六万个,可用于世界上多种语言的书面形式及附加符号的表示、输入、显示、存储、处理、交换和传输。其中中文简繁体汉字、日文用汉字、朝鲜文用汉字(简称CJK汉字)共20902个。
ISO 10646标准颁布后,又经历了一系列的修改与扩充。经过中、日、韩等国的不懈努力,目前CJK汉字扩充集的6582个汉字、彝文和汉字结构符、汉字部首与构件编码已纳入BMP,蒙文和藏文编码也取得重要进展。目前正在制定辅助平面(可收入汉字的标准,辅助平面2将纳入CJK汉字扩充集Extension B的四万多汉字及Super CJK的六万多汉字。
其实,使用ISO 10646,中国是最大的受益国。但奇怪的是国外的公司为了软件的国际化对ISO 10646十分积极,而我国的部分企业却不重视。
但是国际化标准的制定进展太慢,可能是对“地方”的积极性没有发挥或发挥不够。特别是UCS中最大量、最困难的工作是汉字部分。在制定UCS标准时应充分重视中国的意见,并充分发挥中国的积极性。
在处理汉字字符集方面,考虑语言中的内在关系,哪些字是常用、次常用,如何排序(按汉语拼音、笔划、部首),如何寻求最佳方案等,最有研究、最有发言权的自然是中国人。当然,海外华人和日本、朝鲜、韩国也都使用汉字,他们对汉字字符也很有研究,也要充分考虑他们的意见,但最大的用户和市场是在中国。
国际化标准组织在汉字字符集中应以中国的意见为重,另外如IBM、SUN等大公司对汉字本地化也有很多研究,对国际化做出很大贡献,也应多和他们协商。
每个国家执行的是本国的国家标准,国际标准只有变为国家标准时才能被该国执行。国际标准是通过多国的国家标准来实现的。
国际化与本地化是一个辨证的关系。国际化是为了解决软件能在各个使用不同语言、不同风俗的国家和地区的编码字符集都能使用的问题,而对计算机程序作出的某些规定。简言之,国际化正是为了解决本地化。另一方面,本地化是国际化向特定本地语言环境的转换,本地化要适应国际化的规定。
国际化标准组织要充分尊重各国标准化组织的意见。汉字共有七八万个,从码位的占有率来看是绝大多数,而且汉字又有简体、繁体、日文用汉字、朝鲜文用汉字、韩国用汉字,可谓是最复杂的。国际化工作中最大量、最复杂的工作就是解决汉字本地化的问题,如果汉字本地化解决好了,国际化的工作就完成了一大半。汉字本地化解决得好坏是衡量国际化工作好坏的试金石。全世界使用汉字的人最多,汉字又是联合国使用的文字,解决好汉字本地化意义十分重大。国际化标准组织应该格外重视中国标准化组织的意见,而不只是听取各中文Linux厂商的意见。现在国际化组织的成果虽然已上网,但与中国标准化组织机构并未建立直接、畅通,有效的联系渠道。
而且对中文(汉字)最了解的还是中国人自己。中文本地化离开中国人是搞不好的,国际化离开中国人也是搞不好的。
另一方面,中国的标准化组织也应主动和Linux国际化组织取得联系,反映自己的意见,有问题和Linux国际化组织协商解决。
制定标准首先应考虑促进技术的发展,有利于整个行业的发展,而不仅仅是保护国内厂家的利益。事实证明单靠制定GB是挡不住国外大公司的。
经济全球化,软件国际化是趋势,Linux也正走向全球,走向国际化。
全球有四分之一的人使用中文,没有中国的“全球化”是不可想象的,所以Linux需要中国,而中国也需要Linux。解决好Linux的国际化和中文本地化对Linux的发展、对中国软件行业都是十分重要的事,意义是十分深远的。我们应抓住Linux机遇,从Linux的国际化和中文本地化突破,把软件行业的国际化/中文本地化来一个比较彻底地解决。
这里有一个很重要的问题是对Unicode怎么看待和对关于字符集的国家标准(GB)如何与国际接轨而又充分体现对中文本地化最有利?
Unicode现在也是国际标准了,而不再只是几家美国公司自己提的方案了。现在微软的产品已支持Unicode ,还有SUN、IBM等大公司都支持Unicode 。
汉字不只是中国人民的宝贵文化遗产,也是亚洲人民的宝贵遗产,而且也是世界文明的共同财富。汉字在很多方面是优于拼音文字的。如汉字能使人引起联想,而联想是一切发明之母,学习和使用汉字有利于大脑智力的开发;使用汉字能以最小的篇幅表达最多的内容;汉字具有美感等。
我国既然决定了要遵循国际化标准ISO 10646并发布了相应的GB13000标准。共收录了七八万个汉字。是尽快过渡到UCS国际标准呢,还是缓慢过渡到UCS国际标准?我看还是尽快过渡好。因为多一个过渡性的GB,就会多一批需转换的大量文件,也就是多一个大包袱。而且BMP已收录了两万七千多个汉字,能满足绝大多数人的使用。
应尽快采用国际标准的字符集和编码方法,以后就只需逐渐补充字型(font)就行了。
关于字符集的标准,有关部门应把重点放在与国际标准有关组织建立联系,把对汉字字符集、少数民族文字字符集和编码的有关意见和他们沟通、协商,争取在国际标准上反映出来。不要再搞新的字符集的GB了,以减少以后向国际化标准转换时的包袱。
标准制定的重点应放在应用程序界面(API)的规范、标准的制定上。制定标准的一个重要作用就是促进应用程序的开发。十分遗憾的是这项工作进展太缓慢了。为了加快进度,最近中科院软件所、红旗软件公司和一些关心API标准的人正在草拟一个标准初稿,准备供大家讨论、修改,以尽快拿出一个草稿供标准化组织讨论。
Linux是操作系统中的一朵奇葩,是中国软件发展的机遇。要使这朵奇葩在中国的大地上生根、发芽,开花,要想抓住Linux机遇,首先必须解决中文本地化的问题。上期我们已经介绍了中文Linux采用中文平台及Linux国际化中的用双字节/多字节编码代替单字节7位或8位编码、使用统一的大字符集ISO 10646等知识的介绍。要建筑稳健的中文Linux,我们还要认识Linux的本地化及Linux核心的修改等重要问题。
3. 本地化数据库Locale DB
国际化的第三个内容是搞好本地化数据库Locale DB。
语言、字符集、文化习俗等组成一个软件运行时的本地环境Locale。一个Locale是从本地化特征中提取的执行环境。它包括语言、地域、字符集。Locale的格式是ZH_CN.GBK,表示中文(zh)、中国(CN)、字符集(GBK)。
Locale可以一组Shell环境变量LANG、LC_ALL、LC_CTYPE、LC_COLLATE、LC_TIME、LC_MONETORY、LC_NUMERIC、LC_MESSAGES进行设置,也可以通过C语言国际标准中提供的setlocale()函数在应用程序中查询和设置。用户可以在运行时设置整个Locale的全部和部分。
Setlocale()函数为应用程序开发者提供了一种具有设置所有或部分(称之为类别)本地化环境的工具,setlocale()函数的语法为:
Char *setlocale (category,locale)
Int category;
Char *locale;
其中category是五个类别之一的名字,这些类别的名字是:
LC_CTYPE(提供字符分类和大小写区分功能);
LC_COLLATE(提供字符串比较和排序功能);
LC_TIME(提供日期和时间表示格式,如中国是年、月、日,美国是 月/日/年,英国是日/月/年);
LC_MONETARY(提供货币表示格式,如中国为阿拉伯数字后加RMB,在财务表格中为$后写阿拉伯数字);
LC_NUMERIC(提供数字表示格式)。
另外,用LC_ALL的特殊值使setlocale()函数设置所有的类别。
Locale数据库中除了上述本地环境服务,还包括消息服务和代码集转换。
4. 输入、输出服务(I/O服务)
输入法可分为两大类,即模式识别类和编码类。模式识别类包括声音输入法、光学字符识别(optical character recognition,OCR)、手写体识别等输入法。编码类主要是基于拼音、笔划、部首等输入法。
图形界面的国际化与中文本地化,具体包括:
建立中文输入模块的摘挂方法和界面;
建立各种点阵汉字库、矢量轮廓汉字库、曲线轮廓汉字库的摘挂方法和界面;
建立基于图形界面的汉字信息处理函数。
图形界面的国际化处理主要在三个层次上:
X字型服务器层(X Font Server)提供处理点阵、矢量轮廓、曲线轮廓文字;
库函数层(Libarries)、提供有关X字型服务器的函数,如把字体装入服务器、调入、查询、释放字型;
命令层(Commands)包括工具类和转换类命令:
图形界面中文本地化提供以下应用程序:汉字造字工具、汉字图标编辑器、汉字图文编辑工具、汉字图形打印工具。
Linux关于输入的标准还是限于键盘输入。在X11R6中,有XIM(X InputMehtod)标准。XIM是在应用程序和输入法之间的通信协议,目前还没有字符终端的输入法标准。
本地化
本地化(localization,L10n,取首尾两个字母,中间有10个字母)是向特定本地语言操作环境的转换。
本地化工作主要包括:代码体系国家特征文件和输入、输出服务的具体实现。
1.代码体系指采用的字符集,我国目前是GB2312、GBK、GB18030和GB13000。
2.国家特征文件指Locale中的本地环境内容。
3.输入、输出服务与国际化中的输入、输出服务密切相关。
输入方法按其功能可分为:输入管理层、前端处理层、输入单元层、输入单元算法层、辅助区处理层。
输入管理层是根据Locale环境自动到指定目录下找出所需的输入方法模块、将其启动或装入应用程序,并填入有关入口表,以便建立应用程序与输入方法之间的联系。
前端处理层是对各个输入单元进行管理、负责解释特殊键的含义,切换输入单元,并把输入单元处理的结果存于相应的缓冲区中,以保证应用程序取走、或调辅助区处理层函数显示。
输入单元层是根据输入单元的要求,对每个输入键事件进行解释、确定相应的动作、形成符合输入单元要求的输入串,并调用输入单元算法层的函数进行字典查找或代码转换运算,把查找结果返回前端处理层。
输入单元算法层是根据上层函数送来的输入码串进行字典查找运算,并把查找结果返回上一层函数。
辅助区处理层用来提供输入方法的界面,即时状态区、预编辑区和造字区类处理函数进行相应的管理。
三、修改Linux的核心,使其完全支持UCS
国际化就是为了解决本地化,它是由一个一个“本地化”组成的。本地化要遵循国际化,本地化完全遵循了国际化,本地化只需要解决输入法和增加字型了。本地化的标准组织应尽量把本地化所需的内容加入到国际化中,并尽量遵循国际化。做好本地化的工作,就是为了消除本地化。什么时候不需要再做本地化的工作了,那就说明本地化和国际化的工作做好了。
ISO 10646是彻底解决“代码壁垒”软件“千年虫”的方法。彻底实行ISO 10646就意味着放弃目前各国的字符集标准,包括中国的GB、美国的ASCII。完全实现UCS,就是在操作系统、高级程序语言、支持软件、应用软件、通信协议、网络都UCS化,即都可以支持UCS。而且一些相关硬件设备如终端、打印机也要支持UCS,因为基本ASCII的硬件设备会把UCS中的一些码值当成控制字符。这时整个系统都是完全国际化了,那时的本地化工作只是提供输入法和扩充字型(Font)。要彻底实行ISO 10646,首先应从操作系统开始做起,对我国来说就是从Linux开始做起。
UCS从1993年颁布至今已7年了,但进展不大。要完全国际化只能一步一步地走。第一步已制定了UCS,下一步就是在操作系统上完全支持UCS。然后各种软件、硬件都逐个完全支持UCS。因为操作系统是所有软件的基础。不动Linux核心,进行的国际化/本地化本质上仍是一个“中文平台”。因为它仍是按字节处理,是架构在操作系统之上的中文处理环境。只有在操作系统上实现按字符处理、支持宽字符,彻底抛弃ASCII和各种“国家标准”, 完全支持UCS ,才能彻底解决问题。中文平台的前途是不光明的,Windows上不就有过多种中文平台吗,后来都被微软的核心汉化彻底击败。
我们以前搞中文平台,是因为我们没有自己的操作系统,也没有掌握源代码,是不得以而为之,是权宜、无奈之举。现在Linux给了我们一个机遇。Linux开放源代码,这给了中国软件业一个千载难逢的好机遇。Linux也要不断创新、不断发展。我们不能总是跟在洋人后面爬行,“打补丁”,无所作为。我们也要对Linux进行改进,展现中国人的聪明才智,对Linux做出自己的贡献。
对Linux的改进主要有两个方面。一是针对Linux的安全漏洞进行改进。八月底在北京召开的Linux World大会上,中科院软件所副所长孙玉芳介绍说,中科院软件所和红旗公司针对Linux的安全漏洞已经进行改进,做了大量工作,并将于近期公布源代码。二是按UCS的要求改造Linux,使其完全支持UCS。对Linux在核心加以改造,以彻底支持UCS,是中文Linux的最终必须要走的道路,也是Linux的正确发展道路。如果Linux的核心不加以改造,以支持UCS,Linux也将会被经济全球化,软件国际化的潮流冲没。那时,彻底支持UCS的操作系统就将取代目前Linux的地位。所以彻底从核心改造Linux以支持UCS,也是有关Linux沿着正确方向健康发展的大事。
脱离经济全球化,软件国际化的潮流,脱离UCS的大方向,孤立地搞民族化、本地化可能会是事倍功半,甚至事与愿违的。
完全实现UCS,不仅促使操作系统改造,对通信程序、对很多应用程序也会有影响。
通信协议也要考虑支持UCS。国家标准《信息技术 因特网中文规范――电子邮件传输格式》正是利用UCS作为通用信息交换代码。用户要通过因特网发送信息时,用本地字符集编码与UCS的转换模块将其转换成UCS-2或其变体形式(UTF-7、UTF-8)后在因特网上传送。接收方可以很容易地将UCS-2转换成本地的字符集编码。这样省去了接收方识别和判断对方发来的信息是用什么编码,也省去了用很多种转换方法将传送来的不同编码的信息分别转换成本地码。只需用一种UCS-2与本地码的转换方法就行了。如果发送方和接收方都用UCS,又可省去收、发时的转换。由此也可看出完全支持UCS的巨大好处。
四、完全支持UCS,为中国软件业带来巨大好处
采用UCS还可大大降低各种软件本地化的工作量,一个为日本或朝鲜设计的软件,可以很容易地改为中文版本,只须改一改输入法和菜单而已。使用UCS也为中国软件走向世界提供了方便之路,专为中文开发的软件可以轻而易举地移植为国际上各地都能使用的版本,因为处理文本的核心软件并不需要改造。
使用UCS也将大大降低各种软件本地化的成本,用户购买软件的费用也降低了,用户选择软件的范围也更大了。
使用UCS使各种软件本地化的成本大大降低,使得软件开发商可以把人力,资金更多地投入到新产品的开发,一个产品在世界各地“同步推出”也更易于实现,用户也能更快地用上最新版本的新软件,那时我们可以说,我国自己开发的民族软件也是国际通用的国际软件。
Linux和相关应用软件完全支持UCS后,我国可以通过制定标准,要求进入我国的类似软件也必须支持UCS,从而推动国际各软件公司也支持UCS。
至于终端和打印机等硬件,我国已能制造、质量也不比国外的差。硬件设备支持UCS问题不会很大。我国率先实现终端和打印机等硬件完全支持UCS,还可通过制定标准保护国产产品,并可促进国际上的同类硬件产品也完全支持UCS。
从核心改造Linux、使其完全支持UCS,下一步我们还要开发完全支持UCS的应用软件。但是为了与现有的应用软件、硬件兼容,操作系统还必须提供一种转换机制,将其核心使用的UCS代码映射成基于字节的本地字符集编码。
人们对微软的意见主要是微软的垄断阻碍了技术发展,产品在中国售价太高,不开放源代码,有“后门”。但是,微软的Wihdows、Office毕竟在市场的占有率为第一,它确有很多地方值得学习,如易学好用,又如从核心完全实现了对UCS-2代码体系的支持。应该说微软在这方面是走在前面了。Windows NT/95/98/2000核心中完全实现了对UCS-2代码体系的支持,它为不同语言的用户提供了一个统一的、基于UCS-2代码的操作系统核心,并且应用软件Office97等也是基于UCS-2代码的。Windows NT/95/98/2000提供一组码页(codepage)来完成UCS-2与现有应用兼容,实现与本地语言如GB/GBK、Big5、JIS等之间的转换。Linux是否也能如此,在操作系统完全实现对ISO 10646(GB13000)UCS代码的支持,通过类似于codepage的映射与现在应用程序兼容,而不必再使用GB。Linux在这方面应向Windows学习,并希望Linux能做得更好。
XML是取代现在在Web上流行的HTML的新一代Web语言。国外很多基于Web的程序都是以XML为基础的。如微软的.net就是以XML为基础的。而XML使用的字符集就是ISO 10646,默认的字符集是UCS-2