================>8 BEGIN of WHITEPAPER_UNICON.TXT 8<================

                         LINUX 终端国际化设计
			==========================
                         马军，北京拓林思软件公司
                        arthur.ma@turbolinux.com.cn

摘  要：本文就Unicon技术详细叙述了Linux终端国际化解决方案。内容涉及了
	Linux内核，设备驱动程序，Locale，输入法服务器，字库管理器，输
	入法客户端等等。
关键词：国际化，Linux内核，设备驱动程序，Locale，输入法服务器，输入法
	客户端， 输入法模块。

一. Linux国际化现状
    随着Inernet的普及，世界各国，特别是使用亚洲多字节语种的国家，开始
意识到国际化的重要性。
    目前，各国有自己的编码，例如，日本有JIS,韩国有KSC,中国有GBK和即将
要实施的GB13080等等。如此多的编码，使得系统兼容和国际交流成为很大的问
题。
    值得令人高兴的是，Linux国际标准化组织在近日发布了Li18nux2000国际
化规格草案。该草案的发布向实现Linux操作系统标准化更迈进了一步，这必将
使全体开发人员和各机构从中受益。Linux的国际化是一项庞大的工程，它对于
支持亚洲语言和其它多字节字符集是不可或缺的，将极大推动Linux在世界各地
的普及。
    国际化组织制定UNICODE标准，在很大程度上解决了问题。目前是向统一码
UNICODE过渡的时期，所以，我们还必须支持各国的标准。
    目前LINUX国际化基本上还是在传统的UNIX方式上。通常是以LOCALE为基础
国际化，由于内核不支持双字节、XFree86不支持多字节语言，使得国际化工作
就是一些Hacking的工作。人们采用各种方式，如修改内核（UNICON），编写新
的TTY，修改运行库，甚至修改X服务器。但一些方法已经固定下来，比如LOCALE
等。
    更好的方法要等到国际化的新标准。

二. Unicon 研发历史
    由于Linux内核从2.2版开始支持framebuffer(一种图形方式)，客观上提供
了终端中文的可观条件。国内第一个提出内核汉化的应该是何锐. 他给梁昌泰
的Email中提到了这种设计思想. 1999年10月，TurboLinux提出Unicon计划，同
年11月底，利启诚率先发表了《基于Linux核心的汉字显示的尝试》。该文章详
细地描述了双字节显示的实现，并公布了所有的源程序。这是国内首次公布内
核汉化的源代码。
    随后，TurboLinux 工程师马军提出了Unicon输入法的分层结构设计。并获
得公司的支持。2000年1月，成了Unicon第一版。同时，孙喜明写了Big5的字体
模块。这样，Unicon可以支持两种语言的现实和输入。
    Unicon1.0版是在2000年3月随TurboLinux6.0发布的. 该版本支持CCE码表
的输入但层次结构并不是很清楚。
    马军又提出了新的设计思想∶输入法客户/服务器结构。当时是用TCP/IP
实现客户服务器通讯的。2000四月中旬，Unicon2.0进入测试阶段。工程师马林
发现响应速度不是很快，又提出了用动态库来实现服务器。该思想在五月份实
现，至此，Unicon2.0 完成，进入Beta测试。 
    六月初，随TurboLinux6.1 版，发布Unicon2.0。本版本是一个高度分层
的结构。对于每一种输入法，只是对应一种驱动程序。用户如果想加入自己的
输入法，只须按固定格式写自己的驱动程序即可，极大方便了用户的开发。另
外，采用系统词库的方式也为用户节省了系统资源。同时，和XFree86所使用
Chinput共享输入法，使TurboLinux的产品高度统一。
    七月份，扩充了Unicon的显示字体。使其可以显示GB，GBK，BIG5，JIS，
KSCM。
    八月，便携了Unicon字体管理器。使系统可以在不同的TTY上显示不同的
字体。
    九月，编写了多语言输入法支持程序。并编写了配置工具。
    十月，Unicon3.0进入了测试阶段。
    十一月，发布Unicon3.0。
      
三. 什么是Unicon？
    Unicon是在Linux内核基础上，增加国际化支持的程序包。它包括内核补
丁、键盘设备程序、输入法服务器和Unicon客户。应用程序可以在此基础上
处理各种语言。与其它终端中文系统相比，Unicon有以下优点：
       1. 最大限度支持国际化，目前本系统可以支持Big5，GB，GBK，
	  JIS，KSC等。
       2. 良好的兼容性
          Unicon以最小的内核改动换取最大的系统兼容。和其它终端软件
	  相比，它可以对鼠标，键盘，显示有良好的支持。最使人欣慰的
	  是，它可以支持滚屏。其它西文软件，不需要经过修改，就可以
	  轻松地处理各国语言。
       3. 每个TTY是独立的机器，有自己独立的状态（字体和输入法,Locale等）
       4. 良好的分层结构，使系统易于扩展
          本系统采用了类似于UNIX系统结构的方案。系统分三层：内核及
	  驱动程序，输入法服务器，输入法。此结构容易扩展、移植。例
	  如，当我们需要将系统移植到一个新的机器上时，主要的工作是
	  在设备及驱动程序上，其余部分基本上不需要作很大修改。
       5. 提供API和通用输入法接口
          为普通程序员提供接口程序。这里包括两个方面的含义∶
	  1> 输入法模块的接口，用户只需按此接口就可以将自己的输入法
	     加到本系统上去；
	  2> Client & Server 的接口，当系统改变时，只需修改这部分，
	     而保持系统不变。
       6. 支持多种字体
          系统支持多字体内核，并在此基础上，提供字体的动态切换。
       7. 支持动态切换语言及输入法
          系统在字体管理程序和输入法服务器的基础上，提供动态切换。
	  极大方便了用户。
       8. 为XFree86的Chinput提供输入法
          由于XFree86的Chinput和Unicon使用同一输入法服务器，所以，
	  它们可以共享输入法。
       9. 提供热键语言动态切换
          本系统提供热键切换语言（字体及输入法）。

四. Unicon总体设计
    和其它系统不同，在Unicon设计时，我们假定每个TTY是一个独立的机器，
有自己的状态。由此，每个有自己独立的输入法和字体。在系统设计上，我们
依照Unix操作系统的特点，将整个系统分为若干层，并尽可能将内核的修改减
少到最小。将系统分为以下几层：
        1. 内核补丁
           智能制表符识别
	       提供制表符智能识别。以支持系统菜单等的正确显示，这部
	       分代码在drivers/char/console.c。
           字体显示程序
	       字体显示部分是在FrameBuffer的总体控制程序上。这样，
	       我们只须修改高层模块，而无需去管底层得各个驱动程序，
	       使得我们得兼容性达到最佳。其次，UNIKEY可以方便地调用
	       补丁程序，方便地控制显示条。详细可以参见内核源码文件
	       drivers/video/fbcon.c
           键盘过滤程序（UNIKEY)
	       我们在两个地方对键盘进行过滤。一个是在键盘中断，另外
	       是在TTY键盘处理程序上。之所以这样处理，是因为：
	       1> 我们必须过滤键,尤其是一些功能键，组合键；
	       2> 我们必须将翻译后的结果发送回操作系统。而当我们将
	          翻译得结果发送回系统时，最快、最方便得方法是将他
	          们写回到TTY上去。这样，UNIKEY可以很方便地对键进行
	          过滤。详细参见内核源码文件drivers/char/pc_keyb.c
	          和include/linux/tty_flip.c
           字体管理程序
               字体管理程序是为了支持TTY字体独立。字体显示程序必须
	       通过调用字体管理器来确定当前TTY的字体及编码方式，以
	       确保正确显示。详细参见drivers/video/fbcon.c等。
        2. 设备驱动程序UNIKEY
           本模块为高层模块提供了键盘过滤、字体管理，输入法显示等等。
	   另外，对系统热键作了翻译，以传送到高层模块。它包括以下几
	   个方面：
           输入法显示
	       本模块是对UNICON输入法条显示的支持。它是通过标准UNIX
	       调用ioctl来实现的。
           键过滤程序
               本模块对TTY1—TTY6进行模拟，包括：
	       1. 系统键过滤，包括对功能键，组合键的翻译，以确保输
		  入法能正确，准确地接受系统的键盘信息；
	       2. 输入法程序向操作系统发送键的接口，通过这个接口，
		  输入法程序将翻译得结果传送到TTY，从而应用程序接受
		  到翻译得结果。
           字体管理器
               字体管理器动态管理字体。用户可以根据自己得喜好，将不
	       同的字体模块放到系统中，从而达到用户满意得效果。
        3. 输入法服务器
           本模块是输入法的管理程序。它为客户端提供输入法。服务器端
	   维护每个连接，使每个客户端有自己独立的状态。另外，通过共
	   享词库，使系统的内存开销降低到最低。
        4. 输入法客户
           本模块为用户看到的终端程序。首先，它通过输入法服务器，打
	   开一种输入法，通过打开UNIKEY，过滤系统键盘，并将所得的键
	   传送到输入法服务器，输入法服务器翻译这个键，客户程序取回
	   结果，并将服务器得结果显示在屏幕上。另外，它还要处理语种
	   切换，帮助，用户造词等等。

五. Unicon 的工作原理。
    1. 显示部分
       显示中文（或其它文字），需要两个条件∶
	   1> 在图形方式下；
	   2> 有编码的字库。

       假定我们在TTY2运行如下程序：
            main ( )
            {
                puts("hello，world.\n");
            }
       系统将通过open("/dev/tty1")，然后，通过系统调用write(2)调用系
   统内核console.c的do_con_write，而do_con_write调用内核的FrameBuffer
   高层管理程序fbcon.c，fbcon.c 调用具体设备驱动程序。
       FrameBuffer将字符串显示到屏幕上。系统用的是默认的内核字库。
       Unicon实际上，就是修改是FrameBuffer高层控制程序fbcon.c，将默
   认的字库指针指到我们的字库，这样，系统就可以显示中文了。

    2. 设备驱动程序
       如上所述，我们的Unikey只是为应用程序（输入法）和内核之间提供
   了一个通讯的接口。我们采用标准的Unix设备接口：struct file_operations，
   将各自处理函数添入，这样一个设备就形成了。
       当系统初始化设备驱动程序时，我们将内核有关Unicon支持的指针赋
   值，使内核能调用驱动程序的函数。

    3. 输入法服务器
       输入法服务器采用面向对象的设计技术。将系统分为接口类、输入法
   控制模块、输入法模块管理器、内码转换器、共享词组模块等等。
       当一个客户连接到服务器时，服务器返回一个句柄。当客户程序打开
   一个输入法，服务器首先检查该输入法是否打开，如果没有打开，就将其
   打开，然后初始化，返回输入法句柄给客户。服务器维护该输入法的状态。
   而客户程序负责到服务器上来取信息。另外，服务器负责客户状态的维护
  （如全角等）。
    4. 输入法客户
       客户程序负责和服务器连接，并通过服务器打开输入法，并将键传送
   到服务器。客户程序从服务器取信息，并显示。另外，客户程序负责传送
   当前的状态（如全角等）。           

六. Unicon系统图
             Unicon User/Kernel/Hardware Architecture
             ========================================

                             +------------------+ 
   +-------------------+     | libimm_server.so |     +--------------+
   |   unicon          |  +->|                  |<-+  |   chinput    |
   |                   |  |  |   shared input   |  |  |              |
   |   console         |  |  |   method server  |  |  |              |
   |   daemon          |  |  +------------------+  |  | X Window XIM |
   |                   |  |  |.so input methods |  |  |              |
   |      +------------|  |  |  /usr/local/lib  |  |  |--------------|
   |      |immclient.a |--+  +------------------+  +--| immclient.a  |
   +-------------------+                              +--------------+
     ^  ^ 
     |  |              +---------------+
     |  |              |  text mode    | 
     |  |              | applications  |
     |  |              +---------------+
     |  |                      ^
     |  |                      |                              user
   --------------------------------------------------------------------
     |  |                      |                              kernel
     |  +-----------------+    |          font modules  
     v                    |    |         +--------------+
   +---------------+      |    |         | encode-gb.o  |------+
   |  /dev/unikey  |      |    |         +--------------+      |  +---------+
   |               |      |    |         +--------------+      |--|         |
   | driver module |      |    |         | encode-gbk.o |------+--| font    |
   +---------------+      |    |         +--------------+      |--| manager |
        ^                 |    |         +--------------+      |  +---------+
        |                 |    |         | encode-big5.o|------+     | | |
        |                 |    |         +--------------+            | | |
        v                 v    v                                     | | |
   +-------------+    +-------------+    +--------------+            | | |
   | keyboard    |    |/dev/tty[0-6]|    | frame buffer |<-----------+ | |
   | driver      |<-->|             |<-->| driver       |<-------------+ |
   |             |    | console tty |    |              |<---------------+
   | pc_keyb.c   |    |   driver    |    | fbcon.c      |
   +-------------+    +-------------+    +--------------+
        ^                                      |
        |                                      |
   --------------------------------------------------------------------
        |                                      |               hardware
        |                                      v
   +-----------+                         +------------+
   | keyboard  |                         |  display   |
   +-----------+                         +------------+

七. Unicon未来
   目前的Unicon产品在一定程度上满足了用户的要求，但还存在缺欠。主要
有以下问题:
       1. 输入法还有待于提高。这是很多用户提出的要求。
       2. 系统是用单线程模拟多个TTY，不是很好的结构。
       3. 系统的字体还依赖于字体模块。没有直接加入字体到内核的工具。
       4. 欧洲语言支持

   所以，未来的Unicon发展将是∶
       1. 用线程来模拟每个TTY
       2. 字体加入到内核的实用工具
       3. 欧洲语言的支持。
   我们有能力在这方面作得更好。

================>8  END of WHITEPAPER_UNICON.TXT  8<================
