日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

52 FreeBSD連載:外掛式中文顯示與輸入軟件

外掛式中文顯示與輸入軟件對(duì)于支持中文的軟件,可以使用自己的方式處理中文的顯示與輸入 。然而更一般的軟件中,都沒(méi)有直接提供中文支持,有些能夠部分識(shí)別中文但無(wú)法處理中文輸入,如Netscape Navigator 。有些根本不能識(shí)別中文,有些甚至將8位字符作為非法字符來(lái)看待 。對(duì)于最后一種過(guò)濾8位字符的情況,是沒(méi)有辦法能使其正常顯示、輸入中文,但對(duì)于前兩種情況,就有變通的方式使其正常顯示和輸入漢字 。
動(dòng)態(tài)連接庫(kù)的wrap技術(shù)
X Window下的客戶(hù)程序要顯示字符,需要調(diào)用libX11.so.6動(dòng)態(tài)連接庫(kù)中的XDrawString()等函數(shù)進(jìn)行具體處理顯示,如果這個(gè)函數(shù)能夠區(qū)分出中文字符,并自動(dòng)使用合適的中文字體進(jìn)行顯示,那么客戶(hù)程序就能正常顯示中文 。因而最基本的想法是修改X11R6中這些相關(guān)的顯示處理函數(shù),使它們能正常顯示中文 。當(dāng)然這可以通過(guò)直接修改XFree86發(fā)行版本中這個(gè)函數(shù)的源代碼,并通過(guò)重新編譯、安裝庫(kù)函數(shù)來(lái)做到 。然而這需要更改原有的正式發(fā)行版本,不是每個(gè)用戶(hù)都愿意并且能夠重新編譯X系統(tǒng)的,并且這種方法對(duì)于不具備源代碼的商業(yè)X服務(wù)器系統(tǒng)就不使用 。而且更改libX11.so.6也不太安全,缺乏靈活性,因此最好不更改原有的連接庫(kù),就能達(dá)到正確處理中文的目的 。
由于一般的應(yīng)用程序使用動(dòng)態(tài)連接的方式,在應(yīng)用程序載入內(nèi)存時(shí),系統(tǒng)才將具體的動(dòng)態(tài)連接庫(kù)連接上 。因此如果在系統(tǒng)載入標(biāo)準(zhǔn)的庫(kù)之前,預(yù)先載入一個(gè)包含同樣名字函數(shù)的動(dòng)態(tài)連接庫(kù)與應(yīng)用程序連接,那么程序會(huì)使用先連接的第一個(gè)庫(kù)中的同名函數(shù)庫(kù),而非原有的標(biāo)準(zhǔn)庫(kù)函數(shù),這種方式就稱(chēng)為包裝(wrap)的方法 。
現(xiàn)代Unix都支持這種預(yù)連接動(dòng)態(tài)連接庫(kù)的能力,系統(tǒng)在載入動(dòng)態(tài)連接庫(kù)之前,首先查看LD_PRELOAD環(huán)境變量,如果這個(gè)變量定義了一個(gè)動(dòng)態(tài)連接庫(kù),那么就在連接其他標(biāo)準(zhǔn)動(dòng)態(tài)連接庫(kù)之前先連接這個(gè)變量定義的動(dòng)態(tài)連接庫(kù) 。因此如果這個(gè)預(yù)載入的動(dòng)態(tài)庫(kù)中有XDrawString()等函數(shù)的定義,那么它們就覆蓋了系統(tǒng)中l(wèi)ibX11.so.6庫(kù)中的原有定義,而這個(gè)包裝庫(kù)可以通過(guò)直接訪問(wèn)libX11.so.6庫(kù)來(lái)找到原有的標(biāo)準(zhǔn)函數(shù),以真正處理顯示 。
出于系統(tǒng)安全的考慮,系統(tǒng)不允許SetUID或SetGID的程序載入LDPRELOAD變量設(shè)置的動(dòng)態(tài)連接庫(kù),這主要是避免用戶(hù)通過(guò)定義自己動(dòng)態(tài)連接庫(kù),在setuid等系統(tǒng)調(diào)用之后取得root權(quán)限 。因此包裝技術(shù)不適合具有SetUID或SetGID屬性的二進(jìn)制執(zhí)行文件 。此外,靜態(tài)連接的執(zhí)行程序在程序內(nèi)部查找顯示函數(shù),也不適合使用包裝技術(shù)(可以使用ldd命令來(lái)查看執(zhí)行程序的動(dòng)態(tài)連接關(guān)系,來(lái)判斷其連接類(lèi)型),除了這兩種情況之外的其他X應(yīng)用程序,就能支持中文包裝技術(shù) 。
在使用包裝技術(shù)時(shí),另一個(gè)重要的問(wèn)題是FreeBSD系統(tǒng)中存在兩種不同的執(zhí)行文件格式,a.out和ELF格式,它們分別使用a.out和ELF格式的動(dòng)態(tài)連接庫(kù) 。因此對(duì)于不同格式的執(zhí)行文件,必須使用相應(yīng)格式的包裝庫(kù)來(lái)包裝不同的libX11.so動(dòng)態(tài)連接庫(kù),不同格式的庫(kù)不能相互連接 。3.0版本以上,缺省格式為ELF,缺省庫(kù)也為ELF格式的動(dòng)態(tài)連接庫(kù) 。因此3.0版本以后要支持對(duì)a.out格式進(jìn)行包裝,一方面包裝的動(dòng)態(tài)連接庫(kù)的位置就改變?yōu)?usr/X11R6/lib/aout/libX11.so.6.1,同時(shí)也需要使用編譯器的-aout選項(xiàng)生成a.out格式的動(dòng)態(tài)連接庫(kù),以進(jìn)行包裝 。當(dāng)前發(fā)行的標(biāo)準(zhǔn)Packages均已經(jīng)轉(zhuǎn)向ELF,仍使用a.out格式主要是一些商業(yè)軟件,如Netscape Navigator 。
Xcin AnyWhere
XA(Xcin AnyWhere)是一個(gè)較早的使用包裝技術(shù)的中文輸入軟件,它原來(lái)僅僅是用于中文輸入,為Xcin提供一個(gè)標(biāo)準(zhǔn)接口,后來(lái)被加入了中文顯示能力 。具備中文顯示能力的XA被稱(chēng)為XA CV版本 。

推薦閱讀