作 者: 于明俭
编者按:Linux 在中国如何发展?往何处发展?这是广大中国Linux爱好者所热切关注的。本站将连载中文Linux的开创者之一于明俭老师最近撰写的长文《Linux 国际化本地化和中文化》。欢迎讨论!
一 国际化、本地化和中文化
1. 国际化、本地化和多语言化的概念
2. 中文化
3. X11 国际化的历史和级别
4. 国际化标准组织
5. 国际化的意义
二 Locale
1. Locale 的概念
2. 在X中使用Locale
3. 文化习俗的差别
三 X 窗口系统的国际化
1. 显示的国际化
1. 字符集和编码
2. 多字节字符(Multibyte)和宽字符(WideChar)的使用
3. Unicode
4. 字体(Font)和字体集(FontSet)
5. 信息的国际化
2. 输入的国际化
3. 打印的国际化
4. 客户程序间通讯的国际化
四 开发符合国际化标准的软件
1. 开发国际化软件
2. 使非国际化软件国际化
五 目前中文化中存在的问题
1. 编码动态切换的问题
2. 中文编码自动识别问题
3. Linux上的中文平台到国际化的过渡
五 附录
1. 宽字符处理函数函数与普通函数对照表
2. X 窗口系统下支持中文的函数库
3. 支持多语言的典型软件
4. 支持Unicode的软件
一 国际化、本地化和中文化
1. 国际化、本地化和多语言化的概念
一般来说,"国际化"是指把原来为英文设计的计算机系统或应用软件改写为同时支持多种语言和文化习俗的过程. 在软件创作的初期,一般的编程语言,编译,开发都是尽支持英文的,为了适应更广的语言和文化习俗,软件有必要在设计结构和机制上支持多语言的扩展特性,这一过程称为国际化. 国际化仅仅是在软件设计上提供了使用多语言的可能.
"本地化"是指把计算机系统或者应用软件转变为使用并兼容某种 特定语言的过程. 比如,把原来为英文设计软件制作为支持中文的软 件就是本地化的一种. 它主要包括翻译文本信息,界面信息,重新设计图标等等.
语言和文化习俗因地域不同而差别很大. 对某一特定的地域的 语言环境称为 "locale". 它不仅包括语言和货币单位,而且还包括数字标示格式,日期和时间格式. 国际化了的软件含有一个"locale" 的"参量",使用该"locale"参量便可以设置某一区域所用的语言环境.
在国际化部分中只处理语言的部分叫"多语言化". 比如,一个 "多语言化"的软件可以同时管理诸如英语,法语,中日韩文,阿拉伯语等.
在英文中,国际化(Internationalization)被缩写为I18N,即只取首尾两个字母,中间字母为18个. 同样地,本地化(Localization) 缩写为L10N,多语言化 (Multilingualization) 缩写为M17N.
在今天,Internet把世界各地的计算机联接了起来,共享信息和技术是必然的趋势和需要. 因此各地的计算机系统可以互相交流变得 越来越重要. 在Linux系统向桌面普及的过程中,Linux软件也需要国际化和本地化.
2. 中文化
"中文化"是一个很模糊的概念. 在Linux上的"中文化"它既包含使 软件或系统国际化,又包含使软件本地化. 也就是说,"中文化"不仅仅 是只把软件本地化这么简单的事情,更重要的是因为Linux直接支持中文的软件太少,做"中文化"必须先做"国际化".
由于历史的原因,现阶段使用的中文又有简体中文和繁体中文之分. 所使用的编码也不同. 支持中文的软件应该同时支持简体中文和繁体中文,这对软件的国际化提出了更高的要求.
1999年是中国Linux发展和普及过程中最重要的一年,其中涌现了许多制作中文 Linux发布版本的公司. 中文Linux的技术都是采取了中文化的捷径----中文平台. 尽管都是中文平台,但是具体实现的技术特点各不相同. 充分展示了中文平台在Linux中文化过程中的魅力. 中文平台 在短期内发挥了巨大的作用,加速 Linux的中文化过程并推动Linux在中国的普及.
中文平台的主要技术特点是不用修改西文应用软件,便可以显示和输入中文(有的情况下会失效). 具体地说,就是利用自己的规范去修改X系统的底层函数. 从修改的层次上分为(1)修改函数库libX11.so,这种方式是动态修改,又称外挂方式. 外挂方式的实现可以是直接修改X11库 或使用LD_PRELOAD载入动态库修改. (2)修改X Server部分,又称内嵌方式,它的实现也分为两种,直接修改X Server 部分和建立虚拟Display(X传输协议的部分代理).
3. X11 国际化的历史和级别
早期的X11R4版本中,仅仅含有支持单字节和双字节字体的函数,所以它不能算是国际化的函数库. 此后,一个叫做"mltalk"的X协会成立并着手研究X窗口系统的国际化问题. 众多的X窗口系统供应商也 参与了该组织. 因为对国际化的研究刚刚开始,所以mltalk提出的了 一个基本问题: 什么是X窗口系统的国际化? 对它的解释也各不相同. 实际上,即使是现在,人们对国际化的定义仍然存在分歧,分歧的焦点 主要集中于对软件或系统怎样程度的国际化才算是真正的国际化.
按国际化的级别来分,下列几种情况都属于国际化:
1. 语言可以切换. 在系统启动时可以设置某种语言
2. 使用不同语言的软件可以同时使用,在应用软件启动时可以设置某种语言
3. 使用不同语言的软件可以同时使用,而且应用软件的语言可以动态切换
4. 使用不同语言的软件可以同时使用,而且在应用软件中可以同时使用不同语言显然,第(4)种国际化方式是最完善的方式,其次是第(3)种,第(2)种 和第(1)种. mltalk 最终决定使用第(3)种,原因是需要支持第(4)种的 X窗口系统供应商是少数的. 从目前Linux上的国际化情况看,支持第(2),(3)种的国际化软件是最常见的,但是第(4)种软件比较少见,而且应用的 意义不是很大.
基于上述观点,X11R5 的目的是,创建支持不用重新编译源代码就可以适应于语言环境的应用软件开发平台. 确切地说,就是国际化 的结构是基于标准C函数 setlocale的. X11R5 确立了以下规范:
1. 切换语言的机制
2. 与语言无关的输出接口
3. 与语言无关的输入接口
4. 资源文件的国际化
5. X工具(Xt)的国际化
此后,以X11R5 为基础,OSF/Motif 完成了国际化改造,并且成为被用户广泛接受的高层图形软件库,直到今天,一些大型的软件仍然使用 Motif 作为基础库使用,如Java,Netscape等. X11R5的规范在制定的同时,为了检测规范的实用性,开发了两套样本应用,即 Xsi 和 Ximp. 两套应用在输入协议上和对locale的支持上都不同,从而为开发商带来了不便.
X11R6 解决了X11R5中存在的问题,主要的变化有,
1. 定义了标准的输入协议
2. Locale数据格式定义
3. 只采用了一种国际化工具的样本应用模块 在输出上,X11R6增加了从由到左的的书写方式,以支持阿拉伯语和希伯来语等,增加了从上到下的书写方式,以支持中文和日文等的书写方向.
4. 国际化标准组织
这里所说的国际化标准是国际化标准组织或一些相关组织制定的一些标准,而且这些标准也会随时间不同而经常更新. 国际化标准涉及到字符集,编码,字体处理,打印,文本绘制,用户界面,语言输入方法,数据交换,文化习俗,等方方面面.
下面列出一些制定国际化标准的组织:
o Li18nux(Linux I18n)
o ANSI(American National Standards Institute)
o POSIX(Portable Operating System Interface for Computer
Environments)
o ISO(International Standards Organization)
o IEEE(Institute of Electrical and Electronics Engineers)
o Unicode Consortium
o Open Group(X Consortium and OSF)
o X/Open and XPG
其中,ANSI/ISO 制定了使用C编程语言编写国际化软件的通用接口. ISO 制定了字符集标准和其它影响locale名字的标准. IEEE提供了一些国际化的通用库函数和设置管理不同locale的用户命令. Open Group是Unix和X窗口系统的国际化标准设立组织. Li18nux 是一个专门从事Linux上的软件国际化 规范制定的组织.
5. 国际化的意义
国际化,特别是国际化中制定的标准,是当今开发国际化软件所必须的. 它也是软件开发的必然趋势. 遵循国际化标准,可以更高效地开发和调试软件和移植软件,降低软件的开发费用,使用户更方便地使用软件. 从国际环境来看,新开发的基本的库函数都会支持国际化标准,基于这些函数库所开发的应用软件理所当然地支持国际化标准,同时有大批的Linux 爱好者把以前不符合国际化标准的软件进行了改造,使它们在一定程度上符合国际化标准. 使用国际化标准的软件,淘汰非国际化标准的软件成为一种趋势.
从国际化的发展历史看,其中许多标准都有日本的商业机构参与,支持日文的软件变得越来越多,而从日语软件移植为中文软件相对于直接移植西文软件相当容易,有时甚至不用改动,这样就节省了许多不必要的劳动. 反过来,符合国际化标准的中文软件又影响日语和韩语软件,成滚雪球之势向前发展. 其次,软件商的开发比较看好亚洲市场中的日本市场,在 Unix/Linux上的日语软件或操作系统一般是符合国际化标准的,所以兼容这一标准是十分必要的. 当然,目前的国际化标准也存在不足之处,特别是对中文这一特殊语言(因为含有GB和Big5两种不能共存的编码)的处理上,应该由中国人在原来的基础上作相应的扩展.
对中文Linux来说,遵循国际化也是必然的趋势. 在以中文平台为基础的中文 Linux上,软件移植已成为必须解决的问题,这个问题的最终解决方法就是遵循同一标准,就目前来说遵循国际化标准是唯一的方法. 鉴于目前中文Linux上的中文平台的混乱状态,国际化标准是从无序到有序过渡的必然途径.
软件的国际标