歡迎您光臨本站 註冊首頁

LINUX 終端國際化解決方案

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  一.Linux國際化現狀
隨著INTERNET的普及,世界各國,特別是使用亞洲多位元組語種的國家,開始意識到國際化的重要性。目前,
各國有自己的編碼,例如,日本有JIS,韓國有KSC,中國有GBK和即將要實施的GB13080等等。如此多
的編碼,使得系統兼容和國際交流成為很大的問題。
值得令人高興的是,Linux國際標準化組織在近日發布了LI18NUX2000國際化規格草案。該草案的
發布向實現Linux操作系統標準化更邁進了一步,這必將使全體開發人員和各機構從中受益。Linux的國際化
是一項龐大的工程,它對於支持亞洲語言和其它多位元組字符集是不可或缺的,將極大推動Linux在世界各地的
普及。國際化組織制定UNICODE標準,在很大程度上解決了問題。目前是向UNICODE過渡的時期,所以,我們
還必須支持各國的標準。
目前LINUX國際化基本上還是在傳統的UNIX方式上。通常是以LOCALE為基礎國際化,由於內核不支持雙位元組、
XFree86不支持多位元組語言,使得國際化工作就是一些Hacking的工作。人們採用各種方式,如修改內核(UNICON),
編寫新的TTY, 修改運行庫,甚至修改X伺服器。但一些方法已經固定下來,比如LOCALE等。更好的方法要等到
國際化的新標準。
二.什麼是Unicon?
Unicon是在Linux內核基礎上,增加國際化支持的程序包。它包括內核補丁、鍵盤設備程序、
輸入法伺服器和Unicon客戶。應用程序可以在此基礎上處理各種語言。與其它終端中文系統相比,
Unicon有以下優點:
1. 最大限度支持國際化,目前本系統可以支持Big5, GB, GBK, JIS, KSC等.
2. 良好的兼容性
Unicon以最小的內核改動換取最大的系統兼容。和其它終端軟體相比,它可以對滑鼠,鍵盤,顯示有
良好的支持。最使人欣慰的是,它可以支持滾屏。其它西文軟體,不需要經過修改,就可以輕鬆地處理
各國語言。
2. 每個TTY是獨立的機器,有自己獨立的狀態(字體和輸入法,Locale等)
3. 良好的分層結構,使系統易於擴展
本系統採用了類似於UNIX系統結構的方案。系統分三層:內核及驅動程序,輸入法伺服器,輸入法。
此結構容易擴展、移植。例如,當我們需要將系統移植到一個新的機器上時,主要的工作
是在設備及驅動程序上,其餘部分基本上不需要作很大修改。
4. 提供API和通用輸入法介面
為普通程序員提供介面程序。這裡包括兩個方面的含義,1. 輸入法模塊的介面,用戶只需按此介面
就可以將自己的輸入法加到本系統上去;2. Client & Server 的介面,當系統改變時,只需修改這
部分,而保持系統不變。
5. 支持多種字體
系統支持多字體內核,並在此基礎上,提供字體的動態切換。
6. 支持動態切換語言及輸入法
系統在字體管理程序和輸入法伺服器的基礎上,提供動態切換。另外,對環境變數,如LOCALE,
同樣進行切換,極大方便了用戶。
7. 為XFree86的Chinput提供輸入法
由於XFree86的Chinput和Unicon使用同一輸入法伺服器,所以,它們可以共享輸入法。
三.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 |----+ |
+---------------+ | | +--------------+ | |
^ | | +--------------+ | |
| | | | 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輸入法還有待於提高。可以提供對微軟輸入法支持。另外,每個用線程來模擬每個TTY
應該是更好的解決方案。我們有能力在這方面作得更好。


[火星人 ] LINUX 終端國際化解決方案已經有389次圍觀

http://coctec.com/docs/linux/show-post-68106.html