分享
 
 
 

FreeBSD连载(52):外挂式中文显示与输入软件

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

外挂式中文显示与输入软件对于支持中文的软件,可以使用自己的方式处理中文的显示与输入。然而更一般的软件中,都没有直接提供中文支持,有些能够部分识别中文但无法处理中文输入,如Netscape Navigator。有些根本不能识别中文,有些甚至将8位字符作为非法字符来看待。对于最后一种过滤8位字符的情况,是没有办法能使其正常显示、输入中文,但对于前两种情况,就有变通的方式使其正常显示和输入汉字。

动态连接库的wrap技术

X Window下的客户程序要显示字符,需要调用libX11.so.6动态连接库中的XDrawString()等函数进行具体处理显示,如果这个函数能够区分出中文字符,并自动使用合适的中文字体进行显示,那么客户程序就能正常显示中文。因而最基本的想法是修改X11R6中这些相关的显示处理函数,使它们能正常显示中文。当然这可以通过直接修改XFree86发行版本中这个函数的源代码,并通过重新编译、安装库函数来做到。然而这需要更改原有的正式发行版本,不是每个用户都愿意并且能够重新编译X系统的,并且这种方法对于不具备源代码的商业X服务器系统就不使用。而且更改libX11.so.6也不太安全,缺乏灵活性,因此最好不更改原有的连接库,就能达到正确处理中文的目的。

由于一般的应用程序使用动态连接的方式,在应用程序载入内存时,系统才将具体的动态连接库连接上。因此如果在系统载入标准的库之前,预先载入一个包含同样名字函数的动态连接库与应用程序连接,那么程序会使用先连接的第一个库中的同名函数库,而非原有的标准库函数,这种方式就称为包装(wrap)的方法。

现代Unix都支持这种预连接动态连接库的能力,系统在载入动态连接库之前,首先查看LD_PRELOAD环境变量,如果这个变量定义了一个动态连接库,那么就在连接其他标准动态连接库之前先连接这个变量定义的动态连接库。因此如果这个预载入的动态库中有XDrawString()等函数的定义,那么它们就覆盖了系统中libX11.so.6库中的原有定义,而这个包装库可以通过直接访问libX11.so.6库来找到原有的标准函数,以真正处理显示。

出于系统安全的考虑,系统不允许SetUID或SetGID的程序载入LDPRELOAD变量设置的动态连接库,这主要是避免用户通过定义自己动态连接库,在setuid等系统调用之后取得root权限。因此包装技术不适合具有SetUID或SetGID属性的二进制执行文件。此外,静态连接的执行程序在程序内部查找显示函数,也不适合使用包装技术(可以使用ldd命令来查看执行程序的动态连接关系,来判断其连接类型),除了这两种情况之外的其他X应用程序,就能支持中文包装技术。

在使用包装技术时,另一个重要的问题是FreeBSD系统中存在两种不同的执行文件格式,a.out和ELF格式,它们分别使用a.out和ELF格式的动态连接库。因此对于不同格式的执行文件,必须使用相应格式的包装库来包装不同的libX11.so动态连接库,不同格式的库不能相互连接。3.0版本以上,缺省格式为ELF,缺省库也为ELF格式的动态连接库。因此3.0版本以后要支持对a.out格式进行包装,一方面包装的动态连接库的位置就改变为/usr/X11R6/lib/aout/libX11.so.6.1,同时也需要使用编译器的-aout选项生成a.out格式的动态连接库,以进行包装。当前发行的标准Packages均已经转向ELF,仍使用a.out格式主要是一些商业软件如Netscape Navigator。

Xcin AnyWhere

XA(Xcin AnyWhere)是一个较早的使用包装技术的中文输入软件,它原来仅仅是用于中文输入,为Xcin提供一个标准接口,后来被加入了中文显示能力。具备中文显示能力的XA被称为XA+CV版本。

XA是由台湾开发者开发的,当前版本为XA-0.4b,它具备GB显示能力的国标版本为xa-1.04。它能够在FreeBSD下编译执行。对于这些包装方式的外挂中文系统,可以使用它提供的shell脚本xa来启动应用程序。

$ Xcin&

$ xa kvt&

或者自己设置LD_PRELOAD变量为wrap动态库的全路径,再启动相应的应用程序。

$ LD_RELOAD=/usr/X11R6/lib/wrap.so; export LD_PRELOAD

$ kvt&

在启动了它的输入服务器Xcin之后,那么就能在xa启动的程序中就能使用热键切换Xcin的中英文输入了。

Chinput与ZhXwin

Chinput是另一个使用了包装技术的中文输入和显示软件,它是使用了cxterm的输入源代码模块在Linux下开发的,在FreeBSD下也能够正常编译运行。Chinput的作者在其正式发布1.4.1版本中包括了几个与中文显示和输入无关的软件,虽然单个软件都还很有用,但是将几个软件捆在一起,使得应用程序管理比较混乱,还是应该将每个单独的应用程序独立出来,Chinput就专门用于中文的输入和管理。FreeBSD中可以使用Packages的管理机制来管理应用程序之间的关系。

Chinput使用资源文件Chinput.ad,并需要Cxterm的输入法,因此需要预先安装Cxterm包。它还提供了一个脚本run来运行应用程序。但直接设置LD_PRELOAD变量的方法也不复杂(移植到FreeBSD后的package中的执行脚本被更名为crun),Chinput的输入服务器为chinput,因此可以使用下面的命令来启动Chinput。

$ chinput &

$ crun kvt &

ZhXWin的输入服务器也使用Chinput的chinput,并加上一个比较简单却有效的用于处理显示的包装库,它可能是基于Chinput的一个早期版本发展的。ZhXWin的优点是简单、有效,标准Chinput使用了几种不同大小的字体进行显示,而ZhXWin仅仅使用一种字体,然而除了一些字符间距的处理方面,其显示效果还不错。

$ LD_RELOAD=/usr/X11R6/lib/libst.so; export LD_PRELOAD; kvt&

使用包装软件

每个包装软件由两个部分组成,一个部分为输入模块,需要单独运行。XA使用Xcin作输入模块,Chinput和ZhXwin使用chinput作输入模块。另一个部分为包装库,需要使用LD_PRELOAD环境变量进行设置。

如果要让窗口管理器,如KDE,也显示中文,就需要在启动这些窗口管理程序之前设置好包装库,这就需要在.xinitrc或.xsession文件中的最前面增加LD_PRELOAD变量的定义:

$ mv ~/.xinitrc ~/.xinitrc.orig$ cat ~/.xinitrcLD_PRELOAD=/usr/X11R6/lib/wrap.soexport LD_PRELOADchinput &^D$ cat ~/.xinitrc.orig ~/.xinitrc

然而由于这些中文包装软件需要处理键盘,以用于输入中文,直接让包装软件接管窗口管理器,就使得它也影响窗口程序的键盘控制,就使得一些热键不能正常使用。虽然通过包装KDE,使KDE能显示中文菜单和中文提示,但为了使用正常的键盘操作,还是推荐对每个需要中文能力的软件分别进行包装,而不要直接对窗口管理器进行包装。

所有的这些中文包装库都比较新,没有经过足够的实践考验或测试,因此存在问题是难免的。当包装了窗口管理器时,如果包装库出现问题,就可能造成X服务器的键盘死锁,对使用者的操作没有反应。然而此时系统并没有停止运行,可以使用网络连接上去,杀死X服务器,更改包装设置。

未完,待续。。。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有