3. 输入的国际化
在X窗口系统下输入主要有三种方式:
1. 单此击键输入单字符
2. 两个或多个组合键输入单字符
3. 除键输入外, 还需要转换服务器
其中前两种用于输入西文字符, 比如对于欧洲语言的特殊字符的输入, 通常采用
重映射键盘的方法. 或者使用"加速键"的方法输入, 加速键是键盘 上的特殊键,
按下后不会使光标向后移动.
在Linux下, 使用软件xkeycaps可以把键盘重新映射并且保存整个键盘 在映射后
的对照表, 使用命令xmodmap可以加载映射表.
对于中文输入, 主要使用第三种输入方式. 针对各种语言的综合考虑, X 窗口系
统在输入上定义了下列区域:
1. 预编辑区域(Preedit Area), 用于显示输入的过程, 当用户输入 字符时,
应立即显示在该区域
2. 状态区域(Status Area), 用于显示输入状态, 对中文来说, 用于显示输入
方法, 全角/半角状态, 中文/西文标点符号状态.
3. 辅助区域(Auxiliary Area), 显示可供选择的列表, 又称选择 区域, 它由
输入服务器控制.
根据预编辑区域和状态区域的不同组合, X 窗口系统共定义了四种输入 的风格
(Input Style):
1. Root风格: 预编辑区域和选择区域都在应用软件之外, 它们都是 由输入服
务器完成的, 输入服务器所显示的界面是根窗口的子 窗口. 如类似"中文之
星"的独立的输入条模式.
2. OffTheSpot风格: 预编辑区域和选择区域在应用软件之内, 通常 是在窗口
下方的某个固定区域内. 如XEmacs的缺省输入模式.
3. OverTheSpot风格: 预编辑区域在当前的输入位置, 状态区域 在应用程序的
某一固定区域. 它通常又称为光标跟随模式, 类似 于Windows下的智能ABC
输入方法
4. OnTheSpot风格: 预编辑区域和选择区域都在应用软件之内, 内容是又输入
服务器发送的, 应用程序负责显示.
对中文输入来说, 最好的风格是(3),(4),(1). 对大部分中文输入方法, 必须弹出
辅助区域, 供用户选择, 只有少数的中文输入方法, 如五笔字型, 比较适合(4).
对于状态区域, 中文输入多数选用在Root风格的窗口的某个 位置或使用专用的控
制条. 在MS Windows下比较常用的光标跟随模式, 可以 用(3),(4)来实现. 鉴于
Linux下有的用户把X Window设置成为虚屏模式, 选 择上述的任何一种模式都不
尽满意.
对应用软件来说, 最简单的输入接口是Root风格, 它把显示部分交给 输入服务器
去做. 编写软件时所用的代码量少, 是对软件初步使用国际化 标准的最佳选择.
从方便用户的角度来看, 应用软件, 特别是高层的库函数 应该同时支持四种输入
风格. 令人遗憾的是, 一般软件仅支持两到三种输入 风格. 所以在现在的输入服
务器(IM Server)也很少支持四种风格, 这似乎 成了鸡和蛋的问题.
下面列出几种常用软件和图形库的XIM支持情况:
NetscapeRoot,OffTheSpot,OverTheSpot
Java Root,OnTheSpot
Qt Root,OverTheSpot
gtk+ Root,OverTheSpot
rxvt Root,OffTheSpot,OverTheSpot
中文输入需要客户软件和服务器软件的的密切配合, 它们之间是通过 XIM(X
Input Method)协议来通讯的. 输入服务器首先起动, 在X Server里 注册自己,
服务器的名字也被注册. 当客户程序起动时, 到X Server里查寻 有没有符合自己
locale类型的输入服务器(如果用XMODIFIERS指定服务器名, 则同时用locale和名
字区分). 找到后, 根据输入服务器提供的风格种类 选择一个最适合自己的风格.
然后客户程序为每一个需要输入的窗口都建立 一个自己的标示IC(Input
Context), 里面含有客户程序的信息, 以后的通讯 则一直使用该标示.
下面是直接使用X Lib和服务器联接的过程, 在高层函数库中, 把这一 过程隐藏
了起来:
XIM im;
XIC ic;
...
if( (im = XOpenIM(display, NULL, NULL, NULL)) == NULL ) {
printf("Error : XOpenIM !\n");
exit(0);
}
//指定预编辑的类型等...
if( (ic = XCreateIC(im,
XNInputStyle, XIMPreeditPosition | XIMStatusNothing,
XNClientWindow, window,
NULL)) == NULL ) {
printf("Error : XCreateIC() ! \n");
XCloseIM(im);
exit(0);
}
...
for(;;) {
XNextEvent(display, &event);
//如果输入服务器接收并处理...继续
if (XFilterEvent(&event, None) == True)
continue;
switch(event.type) {
case Expose:
XmbDrawString(...);
case KeyPress:
count = XmbLookupString(ic,
(XKeyPressedEvent *) &event,
string, len, &keysym, &status);
...
}
}
目前使用比较广泛的XIM输入服务器有Chinput(简体中文, 同时支持繁体), xcin[1] [2] [3] [4] 下一页 |