全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3275
推到 Plurk!
推到 Facebook!

Linux 國際化本地化和中文化

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-21 19:45:31 IP:61.64.xxx.xxx 未訂閱
Linux 國際化本地化和中文化 編者按:Linux 在中國如何發展?往何處發展?這是廣大中國Linux愛好者所熱切關注的。本站將連載中文Linux的開創者之一于明儉老師最近撰寫的長文《Linux 國際化本地化和中文化》。歡迎討論! -------------------------------------------------------------------------- 一 國際化、本地化和中文化 1. 國際化、本地化和多語言化的概念 2. 中文化 3. X11 國際化的歷史和級別 4. 國際化標準組織 5. 國際化的意義 二 Locale 1. Locale 的概念 2. 在X中使用Locale 3. 文化習俗的差別 三 X 視窗系統的國際化 1. 顯示的國際化 1. 字元集和編碼 2. 多位元組字元(Multibyte)和寬字元(WideChar)的使用 3. Unicode 4. 字體(Font)和字體集(FontSet) 5. 資訊的國際化 2. 輸入的國際化 3. 列印的國際化 4. 客戶程式間通訊的國際化 四 開發符合國際化標準的軟體 1. 開發國際化軟體 2. 使非國際化軟體國際化 五 目前中文化中存在的問題 1. 編碼動態切換的問題 2. 中文編碼自動識別問題 3. Linux上的中文平臺到國際化的過渡 五 附錄 1. 寬字元處理函數函數與普通函數對照表 2. X 視窗系統下支援中文的函數庫 3. 支援多語言的典型軟體 4. 支援Unicode的軟體 -------------------------------------------------------------------------- 一 國際化、本地化和中文化 1. 國際化、本地化和多語言化的概念 一般來說,"國際化"是指把原來?英文設計的電腦系統或應用軟體改寫?同時支援多種語言和文化習俗的過程. 在軟體創作的初期,一般的編程語言,編譯,開發都是盡支援英文的,?了適應更廣的語言和文化習俗,軟體有必要在設計結構和機制上支援多語言的擴展特性,這一過程稱?國際化. 國際化僅僅是在軟體設計上提供了使用多語言的可能. "本地化"是指把電腦系統或者應用軟體轉變?使用並相容某種 特定語言的過程. 比如,把原來?英文設計軟體製作?支援中文的軟 件就是本地化的一種. 它主要包括翻譯文本資訊,介面資訊,重新設計圖示等等. 語言和文化習俗因地域不同而差別很大. 對某一特定的地域的 語言環境稱? "locale". 它不僅包括語言和貨幣單位,而且還包括數位標示格式,日期和時間格式. 國際化了的軟體含有一個"locale" 的"參量",使用該"locale"參量便可以設置某一區域所用的語言環境. 在國際化部分中只處理語言的部分叫"多語言化". 比如,一個 "多語言化"的軟體可以同時管理諸如英語,法語,中日韓文,阿拉伯語等. 在英文中,國際化(Internationalization)被縮寫?I18N,即只取首尾兩個字母,中間字母?18個. 同樣地,本地化(Localization) 縮寫?L10N,多語言化 (Multilingualization) 縮寫?M17N. 在今天,Internet把世界各地的電腦聯接了起來,共用資訊和技術是必然的趨勢和需要. 因此各地的電腦系統可以互相交流變得 越來越重要. 在Linux系統向桌面普及的過程中,Linux軟體也需要國際化和本地化. 2. 中文化 "中文化"是一個很模糊的概念. 在Linux上的"中文化"它既包含使 軟體或系統國際化,又包含使軟體本地化. 也就是說,"中文化"不僅僅 是只把軟體本地化這?簡單的事情,更重要的是因?Linux直接支援中文的軟體太少,做"中文化"必須先做"國際化". 由於歷史的原因,現階段使用的中文又有簡體中文和繁體中文之分. 所使用的編碼也不同. 支援中文的軟體應該同時支援簡體中文和繁體中文,這對軟體的國際化提出了更高的要求. 1999年是中國Linux發展和普及過程中最重要的一年,其中湧現了許多製作中文 Linux發佈版本的公司. 中文Linux的技術都是採取了中文化的捷徑----中文平臺. 儘管都是中文平臺,但是具體實現的技術特點各不相同. 充分展示了中文平臺在Linux中文化過程中的魅力. 中文平臺 在短期內發揮了巨大的作用,加速 Linux的中文化過程並推動Linux在中國的普及. 中文平臺的主要技術特點是不用修改西文應用軟體,便可以顯示和輸入中文(有的情況下會失效). 具體地說,就是利用自己的規範去修改X系統的底層函數. 從修改的層次上分?(1)修改函數庫libX11.so,這種方式是動態修改,又稱外挂方式. 外挂方式的實現可以是直接修改X11庫 或使用LD_PRELOAD載入動態庫修改. (2)修改X Server部分,又稱內嵌方式,它的實現也分?兩種,直接修改X Server 部分和建立虛擬Display(X傳輸協定的部分代理). 3. X11 國際化的歷史和級別 早期的X11R4版本中,僅僅含有支援單字節和雙位元組字體的函數,所以它不能算是國際化的函數庫. 此後,一個叫做"mltalk"的X協會成立並著手研究X視窗系統的國際化問題. ?多的X視窗系統供應商也 參與了該組織. 因?對國際化的研究剛剛開始,所以mltalk提出的了 一個基本問題: 什?是X視窗系統的國際化? 對它的解釋也各不相同. 實際上,即使是現在,人們對國際化的定義仍然存在分歧,分歧的焦點 主要集中於對軟體或系統怎樣程度的國際化才算是真正的國際化. 按國際化的級別來分,下列幾種情況都屬於國際化: 1. 語言可以切換. 在系統?動時可以設置某種語言 2. 使用不同語言的軟體可以同時使用,在應用軟體?動時可以設置某種語言 3. 使用不同語言的軟體可以同時使用,而且應用軟體的語言可以動態切換 4. 使用不同語言的軟體可以同時使用,而且在應用軟體中可以同時使用不同語言 顯然,第(4)種國際化方式是最完善的方式,其次是第(3)種,第(2)種 和第(1)種. mltalk 最終決定使用第(3)種,原因是需要支援第(4)種的 X視窗系統供應商是少數的. 從目前Linux上的國際化情況看,支援第(2),(3)種的國際化軟體是最常見的,但是第(4)種軟體比較少見,而且應用的 意義不是很大. 基於上述觀點,X11R5 的目的是,創建支援不用重新編譯源代碼就可以適應於語言環境的應用軟體發展平臺. 確切地說,就是國際化 的結構是基於標準C函數 setlocale的. X11R5 確立了以下規範: 1. 切換語言的機制 2. 與語言無關的輸出介面 3. 與語言無關的輸入介面 4. 資源檔案的國際化 5. X工具(Xt)的國際化 此後,以X11R5 ?基礎,OSF/Motif 完成了國際化改造,並且成?被用戶廣泛接受的高層圖形軟體庫,直到今天,一些大型的軟體仍然使用 Motif 作?基礎庫使用,如Java,Netscape等. X11R5的規範在制定的同時,?了檢測規範的實用性,開發了兩套樣本應用,即 Xsi 和 Ximp. 兩套應用在輸入協定上和對locale的支援上都不同,從而?開發商帶來了不便. X11R6 解決了X11R5中存在的問題,主要的變化有, 1. 定義了標準的輸入協定 2. Locale資料格式定義 3. 只採用了一種國際化工具的樣本應用模組 在輸出上,X11R6增加了從由到左的的書寫方式,以支援阿拉伯語和希伯來語等,增加了從上到下的書寫方式,以支援中文和日文等的書寫方向. 4. 國際化標準組織 這裏所說的國際化標準是國際化標準組織或一些相關組織制定的一些標準,而且這些標準也會隨時間不同而經常更新. 國際化標準涉及到字元集,編碼,字體處理,列印,文本繪製,用戶介面,語言輸入方法,資料交換,文化習俗,等方方面面. 下面列出一些制定國際化標準的組織: o Li18nux(Linux I18n) o ANSI(American National Standards Institute) o POSIX(Portable Operating System Interface for Computer Environments) o ISO(International Standards Organization) o IEEE(Institute of Electrical and Electronics Engineers) o Unicode Consortium o Open Group(X Consortium and OSF) o X/Open and XPG 其中,ANSI/ISO 制定了使用C編程語言編寫國際化軟體的通用介面. ISO 制定了字元集標準和其他影響locale名字的標準. IEEE提供了一些國際化的通用庫函數和設置管理不同locale的用戶命令. Open Group是Unix和X視窗系統的國際化標準設立組織. Li18nux 是一個專門從事Linux上的軟體國際化 規範制定的組織. 5. 國際化的意義 國際化,特別是國際化中制定的標準,是當今開發國際化軟體所必須的. 它也是軟體發展的必然趨勢. 遵循國際化標準,可以更高效地開發和調試軟體和移植軟體,降低軟體的開發費用,使用戶更方便地使用軟體. 從國際環境來看,新開發的基本的庫函數都會支援國際化標準,基於這些函數庫所開發的應用軟體理所當然地支援國際化標準,同時有大批的Linux 愛好者把以前不符合國際化標準的軟體進行了改造,使它們在一定程度上符合國際化標準. 使用國際化標準的軟體,淘汰非國際化標準的軟體成?一種趨勢. 從國際化的發展歷史看,其中許多標準都有日本的商業機構參與,支援日文的軟體變得越來越多,而從日語軟體移植?中文軟體相對於直接移植西方軟體相當容易,有時甚至不用改動,這樣就節省了許多不必要的勞動. 反過來,符合國際化標準的中文軟體又影響日語和韓語軟體,成滾雪球之勢向前發展. 其次,軟體商的開發比較看好亞洲市場中的日本市場,在 Unix/Linux上的日語軟體或作業系統一般是符合國際化標準的,所以相容這一標準是十分必要的. 當然,目前的國際化標準也存在不足之處,特別是對中文這一特殊語言(因?含有GB和Big5兩種不能共存的編碼)的處理上,應該由中國人在原來的基礎上作相應的擴展. 對中文Linux來說,遵循國際化也是必然的趨勢. 在以中文平臺?基礎的中文 Linux上,軟體移植已成?必須解決的問題,這個問題的最終解決方法就是遵循同一標準,就目前來說遵循國際化標準是唯一的方法. 鑒於目前中文Linux上的中文平臺的混亂狀態,國際化標準是從無序到有序過渡的必然途徑. 軟體的國際標準化也?最終用戶帶來極大的好處,如同時支援簡體中文和繁體中文,中文操作?雙位元組操作,中文輸入能夠在更大的程度上使用標準輸入介面帶來的好處,如輸入伺服器的定位等互動式操作. 國際化的另一個特點是工作在應用軟體級別,所以國際化不會給X視窗系統帶來不穩定性. (第一章完) Linux 國際化本地化和中文化(二) 藍森林 http://www.lslnet.com 2000年4月29日 21:34 作 者: 於明儉 (justiny@turbolinux.com.cn) -------------------------------------------------------------------------- 國際化、本地化和中文化 國際化、本地化和多語言化的概念 中文化 X11 國際化的歷史和級別 國際化標準組織 國際化的意義 Locale Locale 的概念 在X中使用Locale 文化習俗的差別 X 視窗系統的國際化 顯示的國際化 字元集和編碼 多位元組字元(Multibyte)和寬字元(WideChar)的使用 Unicode 字體(Font)和字體集(FontSet) 資訊的國際化 輸入的國際化 列印的國際化 客戶程式間通訊的國際化 開發符合國際化標準的軟體 開發國際化軟體 使非國際化軟體國際化 目前中文化中存在的問題 編碼動態切換的問題 中文編碼自動識別問題 Linux上的中文平臺到國際化的過渡 附錄 寬字元處理函數函數與普通函數對照表 X 視窗系統下支援中文的函數庫 支援多語言的典型軟體 支援Unicode的軟體 -------------------------------------------------------------------------- 二 Locale Locale 的概念 Locale 是ANSI C語言中最基本的支援國際化的標誌, 對中文Linux來說, 如果它支援國際化, 那?支援中文Locale是最基本的要求. Locale 是軟體在運行時的語言環境, 它包括語言(Language), 地域 (Territory)和字元集(Codeset). 其格式?: 語言[_地域[.字元集}. 如對中文GBK字元集, locale的格式是:zh_CN.GBK. 目前Linux上的中文 Locale還不完善, glibc2.1.x中的許多涉及Locale的C函數還不正確. 如果 用戶需要安裝中文GBK Locale, 可以直接使用TLC6.0中的: glibc-2.1.2(含有GBK模組) localedata-zh-0.07 /usr/X11R6/lib/X11/locale/zh_CN.GBK/XLC_LOCALE(X 下的 GBK Locale) Locale 包含了以下分類: LC_COLLATE, 用於比較和排序. 排序對中文來說也比較重要, 但是現在的 glibc中的locale對中文支援有些問題. 漢字排序的 的方式有許多種, 按照 發音(中文拼音)或者漢字筆畫來排序 是比較容易被接受的. LC_CTYPE, 用於字元分類 LC_MONETORY, 用於貨幣單位 LC_NUMERIC, 用於數位顯示格式. 下面是不同國家的在貨幣符號 和數位格 式上的不同: 中國大陸: 1,234.56RMB 美國: $1,234.56 德國: 1.234,56DM LC_TIME, 用於時間和日期. 時間可以用12小時或者24小時的 格式來計算. 在小時和分鐘之間可以用逗點或者冒號隔開. 下面 是一些Locale設置的時 間和日期的格式: 中國: 14點20分 2000年三月十四號 英國: 02:20pm 14/03/2000 美國: 02:20pm 03/14/2000 芬蘭: 14.20 14.03.2000 LC_MESSAGES, 用於國際化資訊, 主要是提示資訊,錯誤資訊, 狀態資訊, 標 題, 標簽, 按鈕和功能表等. Locale 通過ANSI C 函數setlocale(分類, locale)來初始化locale 資料. 當locale設置?空時, locale的值便從系統的環境變數中取得. ?了 方便應用 軟體, 設置所有的分類, 可以採用下述方式: setlocale(LC_ALL, ""); 如果不成功, 該函數返回NULL. 函數應該回落到setlocale(LC_ALL,"C"). 在X中使用Locale 在X的客戶程式中使用Locale的機制和在標準C函數中使用Locale的方式一樣, 除 此之外, 在X庫中還定義了另外兩個函數來判斷X的locale支援和設置locale 的修 飾(XModifier), 在X中使用Locale和libX11的基本步驟如下: setlocale(): 設置當前的locale XSupportLocale(): 用來判斷X是否支援目前設置的locale. XSetLocaleModifier(): 它用來指定一系列的locale修正值. 它的參量的格 式是@分類=賦值. 目前唯一可用的是輸入 伺服器的名稱"im". 如果參量? 空, 則根據系統的環境 變數XMODIFIERS查找. 比如在系統上設置了環境變 量: % setenv XMODIFIERS @im=Chinput (csh) 或 % export XMODIFIERS=im=Chinput (bash) 則客戶程式將查找到輸入伺服器Chinput, "Chinput"是 輸入伺服器所設置 的名稱. 文化習俗的差別 下面是在國際化和本地化過程中常常遇到的並且應當注意的地方, 對國際化軟體 的開發, 應該充分注意到各個地域的文化和習慣, 開發出通用的軟體, 對於本地 化過程, 則應選擇與本地域相符的習慣. 姓名,地址等特殊資訊 姓名中的"姓"和"名"的先後次序, 地址書寫的先後次序 電話號碼的長度等 等 圖示的通用性 圖示是易於接受的用戶介面, 設計時應考慮到地域習慣, 而且圖示上不能有 圖形文字, 否則需要重新設計本地圖示, 並翻譯圖示上的文字. 聲音使用 不適當的聲音或提示可能會引起人的反感. 另外, 聲音 的性別對某些國家 是敏感的. ?色使用 ?色和色調與民俗有關, 比如紅色在美國表示危險, 在中國 表示喜慶. 紙張尺寸 打印紙的尺寸因地域而不同, 在選擇缺省尺寸時應注意. 鍵盤差別 在鍵盤上的鍵可能因國家而異, 鍵的個數也可能不一樣. 影射關係也不同. 政治因素 在?品設計上, 儘量不要有政治敏感性部分. (第二章完) 三 X 視窗系統的國際化 在 X 視窗系統上的國際化, 特別是中文化, 主要體現在顯示,輸入和列印三個方面. 1. 顯示的國際化 1. 字元集和編碼 在Linux上經常使用的字元集是ISO 8859系列的字元集. 它包含了10個 多語 言的單字節編碼字元集. 它們分別是, 字元集 涵蓋語言 拉丁一字元集, 包含絕大多數的歐洲語言, 例如French(fr), Spanish (es), Catalan (ca), Basque (eu), Portuguese (pt), Italian (it), Albanian (sq), Rhaeto-Romanic (rm), Dutch (nl), ISO 8859-1(Latin1) German (de), Danish (da), Swedish (sv), Norwegian (no), Finnish (fi), Faroese (fo), Icelandic (is), Irish (ga), Scottish (gd), English (en), Afrikaans (af) 和 Swahili (sw). 影響了 美洲, 澳洲和非洲. 拉丁二字元集, 包含了中歐和東歐的語 ISO 8859-2(Latin2) 言:Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), Slovak (sk), Slovenian (sl), Sorbian. ISO 8859-3(Latin3) 拉丁三字元集, 包括: Esperanto (eo) and Maltese (mt) 拉丁四字元集, 包括: Estonian (et), 巴 ISO 8859-4(Latin4) 爾地克 Latvian (lv) 和 Lithuanian (lt), Greenlandic (kl) , Lappish. Bulgarian (bg), Byelorussian (be), ISO 8859-5(西裏爾語) Macedonian (mk), Russian (ru), Serbian (sr) ISO 8859-6(阿拉伯語) 阿拉伯語(ar) ISO 8859-7(希臘語) 希臘語(el) ISO 8859-8(希伯來語) Hebrew (iw) 和Yiddish (ji) ISO 8859-9(Latin5) 重排了Latin1, 用土耳其語的幾個字母做了 替換 ISO 8859-9(Latin6) 重排了Latin4, 去掉了某些符號, 增加了 Inuit等 ISO 8859-11(泰國語) 泰國語(th) ISO 8859-12 Celtic ISO 8859-13(Latin7) Baltic Rim 和 Lativian(lv) ISO 8859-14(Latin8) Gaelic 和 Welsh (cy) ISO 8859-15(Latin9) Latin1的變種, 修改了某些字母 雙位元組字元集主要包含中文,日文和韓文. 它由前導位元組(Lead Byte) 和尾 部位元組(Trail Byte)構成, 由於一個字元採用了兩個位元組, 在軟體的 國際 化方面又增加了一些麻煩, 比如在顯示上, 游標的位置不能位於漢字 之間, 刪除和移動時必須是整字操作等, 在輸入上, 一般需要預編輯伺服器 才能 輸入漢字. 下表列出了中日韓語言編碼的有關資訊: 語 前導位元組範 言 字元集 內碼表 圍 尾部位元組範圍 簡 GB2312-1980 CP936 0xA1-0xF7 0xA1-0xFE 體 中 文 GBK 無 0x81-0xFE 0x40-0x7E, 0x80-0xFE 中 文 繁 BIG-5 CP950 0x81-0xFE 0x40-0x7E, 0xA1-0xFE 體 日 0x81-0x9F, 文 Shift-JIS CP932 0xE0-0xFC 0x40-0xFC(0x7F除外) KSC-5601-1987 CP949 0x81-0xFE 0x41-0x5A,0x61-0x7A,0x81-0xFE 0x84-0xD3 韓 0xD8 0x41-0x7E 文 KSC-5601-1992 CP1361 0xD90-0xDE 0x81-0xFE 0xE0-0xF9 0x31-0x7E 0x41,0xFE 最近, 資訊?業部和國家質量技術監督局聯合發佈了兩項新的中文資訊 處 理基礎性國家標準,?解決偏、生漢字的輸入提供了方案。其中GB18030- 2000《資訊技術和資訊交換用漢字編碼字元集、基本集的擴充》,?強制性 國家標準. 它收錄了2.7萬多個漢字,總編碼空間超過150萬個碼位,?徹底 解決郵政、戶政、金融、 地理資訊系統等迫切需要的人名、地名用字問題 提供了解決方案,也?漢字研究、古籍整理等領域提供了統一的資訊平臺基 礎。 這項標準還同時收錄了藏文、蒙文、維吾爾文等主要的少數民族文字. 字元 集編碼範圍是: 位元組數 編碼空間 碼位元數目 單字節 0x00-0x80 129 雙位元組 第一位元組:0x81-0xFE 23940 第二位元組:0x40-0x7E,0x80-0xFE 四位元組 四位元組範圍分別是: 1587600 0x80-0xFE,0x30-0x39,0x81-0xFE,0x30-0x39 香港特別行政區也對Big5編碼提出了"香港增補字元集", 其目的,是 收納 香港特區政府及市民在中文電子通訊中有需要使用的字元,來補充目前 大 五碼和ISO10646編碼標準內並未包含的字元,以作?一個通用的中文介面, 方便大家能準確地以中文進行電子通訊。香港增補字元集有兩套編碼方案, 一套適用於大五碼系統,另一套適用於ISO10646平臺。香港增補字元集的大 五碼版本,實際上是政府通用字形檔的增訂版。ISO10646國際編碼標準目前並 未包含香港增補字元集內的所有字元。目前尚未收納在ISO10646內的香港增 補字元集字元,均已提交國際標準化組織管轄下的表意文字小組,以考慮是 否納入ISO10646日後的新增版本內. 上述標準和草案應該是以後的中文Linux所應該遵循的. 2. 多位元組字元(Multibyte)和寬字元(WideChar)的使用 我們平時見到的以文本方式存在的字元都是多位元組字元, 它主要用於 文件 存儲和網路上的以流(Stream)的方式傳輸. 一個GB編碼的漢字需要兩個 字 節. 多位元組字元的缺點是在中文處理上不方便, 比如漢字的刪除和游標的 移動都會有半漢字問題. ?了文本處理的方便, 在內部操作上通常是把漢字 與英文的混和字串先轉換成等寬度的字串, 即寬字元, ?軟體的內部處 理 提供方便. glibc2.1.x中多位元組字元串和寬字串的轉換有時有問題. 在X下還可以 使 用另外一種方式完成轉換, 即使用XmbTextListToTextProperty()和 XwcTextPropertyToTextList() 聯合完成轉換. 3. Unicode 目前所使用的Unicode 是一種16位元字寬的字元編碼, 它由非贏利的電腦 組織Unicode研討會維護和改進. 它起源於Xerox和Apple之間的合作研究. 幾 個公司組成了一個非正式的論壇, 接著IBM, Microsoft等公司迅速加入. Unicode研討會在1990年發表了Unicode標準版本1, 同時國際標準化組織完 成 了一種類似的編碼----ISO 10646. 因?沒有必要存在兩套標準, 所以 Unicode 研討會和國際標準化組織在1991到1992合二?一. 1994年, 中國和 日本開始對 基於ISO10646上的國家標準進行工作. 現在, Unicode 開始用 在許多?品中. Unicode包含了當今電腦領域中廣泛使用的所由字元, 如世界上大部分 的 書面語言, 印刷字元, 數位和技術符號, 地理圖形和標點符號. 由於 Unicode 的一致性, 它在大多數情況下都可能簡化軟體的國際化過程. 它取 消了處理 多種內碼表的必要, 並且由於是16位元編碼, 因此由雙位元組字元集 所引起的額外 處理也不必要了. 但是, Unicode作?一種編碼也有它的缺陷, 比如編碼的位置與排序無關, 所以使軟體支援Unicode僅僅是國際化的第一步, 實際情況中還需要與語言 相關 的資訊和規則. 所以Unicode一般作?程式的內部處理編碼, 必須提供 與其他 編碼的雙向轉換表. 最後需要說明的是, 雖然使用Unicode會使普通的英文文本大兩倍, 但是 使 用Unicode的整個系統卻不會增加太大, 因?系統存放的文件大部分是二進 制 文件格式, 同時, 使用針對Unicode的壓縮方式, 可以把文件壓縮成和使 用對應 的8位正文一樣大小. 4. 字體(Font)和字體集(FontSet) 在X視窗系統下使用的字體都必須在X伺服器中註冊X邏輯字體描述(X Logical Font Description)名. 它包括了字體的許多資訊, 例如以下?西 文字體和中文 字體的兩個例子. 1. -adobe-times-medium-r-normal--14-140-75-75-p-74-iso8859-1 2. -tlc-song-medium-r-normal--24-240-75-75-c-240-gbk-0 ?了方便使用, 用戶還可以給每一個字體加一個或多個別名, 別名文件 fonts.alias 放在字體目錄下, 可以手工編輯. 當字體目錄變更或別名變更 後, 必須使用命令 "xset fp rehash"或重新?動X才起作用. X 字體也可以通過字體伺服器(Font Server)載入. 這對於本地不放字體 的 系統或X終端特別有用. 載入的協定可以是TCP或DECNET. X 視窗系統的字體在X Server中之存在一份, 當所由軟體都不使用它時, 字 體的記憶體自動施放. 字體中包含了製造商名, 字體類型, 權重, 字體大小, 字元集等資訊. 它們 也 可以縮寫, 省去的部分用星號代替, 比如對上面的中文字體, 可以縮寫 ?: -*-song-*-24-*-gbk-0 在實際應用中, 字串往往是中文和英文的混和字串, 所以必須使用兩種 字體來繪出該字串, 這種指定兩種或兩種以上的字體的描述就是字體集. 字體 集一般的格式是把多種字體用逗號隔開, 比如, 指定下列字體集: "-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-*,-tlc-song-medium-r-normal--14-*-*-*-*-*-gbk-0" 令人遺憾的是, 中文的GB編碼和Big5編碼有重疊區域, 不能區分開來, 所以 字體集並不能同時指定GB和Big5的字體. 字體集的具體載入受到Locale的影響. 在許多已經國際化的軟體和圖形庫中, 一般通過資源檔案讓用戶指定字體 集, 比如gtk的簡體中文資源檔案?/etc/gtk/gtkrc.zh_CN, qt-1.44(國際 化的)的 資源檔案是 ~/.qti18nrc 等等. 2. 資訊的國際化 資訊(Message)國際化是軟體國際化中比較重要的一環, 如果使軟體可以 支援多 種語言, 在設計時就應當考慮到資訊的國際化問題. 現在的絕大多數 軟體使用 GNU的gettext作?基本工具. 資訊國際化的基本步驟是: o 在軟體初始化時設置使用setlocale()設置Locale o 使用gettext巨集定義, 使程式看上去比較方便: o 指定資訊的位置: o 指定翻譯資訊: _("Some Strings"); o 在軟體完成後,使用 xgettext 提取資訊並翻譯 o 使用msgfmt把資訊文件轉換?.mo文件, 安裝到locale目錄下 /* file this_app.c */ #include #include #define _(String) gettext(String) #define N_(String) gettext(String) #define __(String) (String) int main(){ //由環境變數決定locale setlocale(LC_ALL, ""); //設置message的位置和檔案名 bindtextdomain("this_app", "/usr/share/locale"); textdomain("this_app"); printf(_("Some String")); } 至此, 本程式的國際化過程已完成. 編譯並聯接成可執行文件this_app. gcc -o this_app this_app.c 下面是本地化的過程. o 提取要翻譯的資訊: xgettext -a -o this_app.po this_app.c o 翻譯資訊 在文件this_app.po 中含有"Some String": msgid "Some String" msgstr "" 翻譯成: msgid "Some String" msgstr "一些字串" o 格式化資訊文件: msgfmt -o this_app.mo this_app.po o 拷貝資訊文件到locale的目錄下, 比如對於中文zh_CN, cp this_app.mo /usr/share/locale/zh_CN/LC_MESSAGES o 執行文件: LC_ALL=zh_CN ./this_app 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 (繁體中文), kinput2(日文) 和 hanIM/ami(韓文). 中文輸入伺服器Chinput 選擇了OverTheSpot風格作?缺省的輸入模式, 它與標準 的輸入風格略有不同, 即把預編輯區域偏離輸入位置, 使輸入區 域同時作?狀態 區域, 在很大程度滿足了用戶的輸入習慣. 同時它還使用 輔助工具條顯示和改變 輸入狀態. Chinput還解決了同時使用GB和Big5編碼 的問題, 被動輸入(Passive Input)問題等. 對於普通用戶, 除了使用鍵盤 輸入外, 還可以使用手寫識別輸入 和語音識別輸入方式. 目前的輸入架構 基本能夠滿足它們的要求. 筆者在手寫識 別輸入方面做了一些嘗試, 發 現對絕大部分軟體是能夠適合被動輸入的. 4. 列印的國際化 在X視窗系統下的列印是一個很難解決的問題, 所以到目前?止沒有形成 一個統 一的列印標準. 其原因之一就是X視窗系統在設計上把顯示和列印完全 分開了. 在Linux最常見的需要列印的文件格式是普通文字檔案和PostScript文件. 對於中 文的普通文字檔案的列印一般需要先轉換?PostScript文件再列印. 對於 PostScript文件, 如果應用軟體在生成時含有中文字體資訊, 則列印 比較容易實 現, 反之, 則很難實現甚至不可能列印. 目前中文文字檔案常用的列印方法通常是,使用gb2ps/bg2ps/cnprint 等 軟體轉 換成PS文件列印, 轉換過程使用了中文的點陣字體. 對已經形成的PS 文件的打 印, 如果不包含中文字體, 直接列印就會輸出亂碼, 通常使用的方法 是將這一類 PS文件過濾一下, 改?使用中文字體, 然後再列印. 如陳向陽先生 的過濾軟體 ps2cps可以列印Netscape的存儲文件. 這種列印的缺點是有時輸出 的PS中漢字字 符串和英文字串對不齊. 最好的方法是在PostScript一級實現 中文列印, 陳向 陽先生對ghostscript進行了中文化, 可以直接使用TTF輕鬆打 印Netscape, Qt/KDE, lyx等軟體輸出的PS文件. 這種從底層實現列印的方法 也是日文和韓文 所採用的方法. 使用CID(adobe)字體列印的方法也在嘗試之中. 總之, 目前的中文列印缺乏統一標準, 應用軟體在輸出列印PS文件時多數 不考慮 雙位元組語言的問題, 使列印變得更加複雜化, 所以當前的中文Linux發 布版本多 數不支援中文列印, 5. 客戶程式間通訊的國際化 客戶程式間通訊(Interclient Communications Conventions, 簡稱ICCC)是 客戶 程式之間共用資源的手段之一. 最常見的應用是文本的拷貝和粘貼和與視窗 管理 器通訊. 但是如果兩個應用程式之間所使用的字元集不同, 粘貼就會出現問 題, 甚至粘貼的內容會丟失. 所以客戶程式之間必須國際化了的通訊協定. 應用程式和視窗管理器之間的通訊也屬於客戶程式間通訊. 如果客戶程式之間使用的字元集相同, 但是編碼不同, 則不會丟失資料, 這時應 該使用複合文本(COMPOUND TEXT)傳輸. X內部定義了COMPOUND_TEXT 的原子 (Atom)用於傳輸中英文混和的字串. 對7位元組編碼, ASCII或者其他 ISO8859-1 字元集, 客戶程式通訊可以不用轉換而直接使用XA_STRING原子傳輸. 四 開發符合國際化標準的軟體 在X視窗系統下開發軟體, 應儘量符合國際化標準. 它包括, 設置合適 的locale(見前 面講述的在X下使用locale), 注意選擇字元集和字體集, 本地化文本的處理, 輸入方法 等等. 這裏推薦用戶儘量使用在國際化方面 已經比較完善的高層圖形庫, 如Qt, gtk , Java等, 這樣可以避免考慮以 上問題. 選擇Motif時需要考慮資源的國際化問題和 FontList等. 1. 開發國際化軟體 使用已經支援國際化的高層圖形庫開發支援國際化的軟體基本上可以不用 考慮國 際化問題. 特別是輸入問題, 在標準的輸入區內(單行輸入和多行輸入), 都可以 自動輸入漢字. 在字體處理上, 注意使用字體集. 許多軟體需要在資源 文件中指 定字體和字體集, 所以開發的軟體應提供一個缺省支援字體集的資源 文件. 下面所介紹的開發國際化的軟體是基於libX11的開發方法. 除了前面所說的 在軟 件初始化時調用一些Locale的函數外, 在實際編程時, 還應注意以下問題: 1. 字體載入: 在處理字串時, 使用FontSet, 而不是Font: XCreateFontSet() - 建立字體集 XFreeFontSet() - 釋放字體集記憶體 XFontsOfFontSet() - 返回XFontStruct和字體名 XBaseFontNameListOfFontSet() - 返回字體集的名稱 XLocaleOfFontSet() - 返回XFontSet的locale名 XExtentsOfFontSet() - 獲得FontSet的最大Extents 2. 計算字串的螢幕尺寸並畫字串: Xmb/XwcDrawString() - 只畫字型(glyphs)的前景 Xmb/XwcDrawImageString() - 畫前景和背景 Xmb/XwcDrawText() - 複雜的間隔和字體集 Xmb/XwcTextEscapement() - X 方向圖元 Xmb/XwcTextExtents() - 字串輪廓 3. 客戶程式間通訊: Xmb/wcTextListToTextProperty() - 根據locale的文本轉換 Xmb/wcTextPropertyToTextList() - 根據locale的文本轉換 XFreeStringList() Xmb/wcFreeStringList() - 釋放StringList XSetWMProperties() - 設置視窗管理器屬性 XSetWMName() - 設置窗口窗口名 XSetWMIconName() - 設置視窗圖示名 4. 輸入: XOpenIM()/XCloseIM() - 打開/關閉輸入伺服器 XDisplayOfIM()/XLocaleOfIM() XSetIMValues()/XGetIMValues() - 設置/獲取輸入伺服器屬性 XCreateIC()/XDestroyIC() - 建立/釋放IC XIMOfIC() XSetICValues()/XGetICValues() - 設置/獲取IC的值 XSetICFocus()/XUnsetICFocus() - 聚焦/取消聚焦 XmbResetIC()/XwcResetIC() - 重設IC XFilterEvent() - 過濾事件 Xmb/wcLookupString() - 查找字串 XRegister/UnregisterIMInstantiateCallback() - 註冊/取消回調 2. 使非國際化軟體國際化 修改已經存在的非國際化軟體, 應根據具體情況採用不同的補丁. 需要 注意的是 修改後的軟體應與原來的軟體相容, 不會對軟體以前在西文和其他 語言的支援造 成影響. Locale應該是軟體的語言切換中心點. 下面是筆者在 修改軟體的過程中 一些經驗, 僅供參考. o 在軟體初始化時設置Locale. o 定義gettext的宏, 並且把它與資訊文件綁定. o 對所有靜態資訊使用gettext o 對文本繪製使用字體集代替字體 o 繪製函數使用X下的多位元組或寬字元函數 o 初始化和XIM伺服器的聯接 o 在事件迴圈中用XFilterEvent()過濾事件到XIM伺服器 o 使用Xmb/wcLookupString()查找字串 五 目前中文化中存在的問題 現有的國際化標準中存在許多問題, 問題的原因主要出自目前的 國際化架構. 對於中 文化來說, 這些問題顯得更加突出. 1. 編碼動態切換的問題 對中文軟體來說, 同時支援多內碼(GB和Big5)是比較完善的中文軟體, 但是動態 切換內碼, 特別是切換軟體介面(如功能表項)的內碼, 是受到資訊 (Message)國際 化中 gettext 的限制的. 一般來說, 一旦軟體載入, 所有 文本資訊便被初始化, 而且在整個過程中不會再重新裝載資訊. 退一步說, 即使重新裝載了資訊, 由於 所裝載資訊的長度發生了變化, 軟體介面調整 佈局也是十分困難的. 所以現有軟體的動態編碼切換僅僅是在部分區域實現, 例如Netscape. 遺憾的是, Netscape的編碼切換並不徹底, 它切換的僅僅是顯示部分, 輸入 部分仍然有問 題. 比如在zh_CN.GBK的環境下?動Netscape, 當切換到有 輸入條的繁體中文頁 面時, 如果採用輸入軟體自動識別Input Context的 編碼的方式, 仍然會認? Netscape是GB編碼, 輸入結果不正確. 如果輸入 Big5編碼, 必須縮定輸出的編碼 ?Big5. Chinput在這方面做了一些嘗試, 結論是可以輸入Big5編碼, 但是在輸入 條中的顯示不正確. 一般來說, 使用中文平臺來動態切換編碼更容易實現. 在中文Linux 的發佈版本 中, 有幾個是可以使用中文平臺來實現動態切換編碼的, 其原理 十分簡單, 只要 在應用程式或X伺服器把某個視窗的編碼狀態記住就行了, 以後的文本顯示和輸入 都以此編碼?標準. 這種方法的缺點是, 應用程式 初始介面上的中文由於轉化了 編碼變成了亂碼. 2. 中文編碼自動識別問題 在文本瀏覽,網頁瀏覽或網頁翻譯時, 通常需要自動識別漢字的內碼, 但是中文的 GB編碼和Big5編碼有重疊區域, 所以很難區分開. 目前公開 源代碼的識別軟體很 少, 識別結果不能令人滿意, 遠沒有達到目前商業軟體 的識別水平. 3. Linux上的中文平臺到國際化的過渡 但是從長遠的角度看, 因?中文在對中文顯示和輸入上與國際化標準 存在很大差 異, 所以亟需一種從中文平臺到國際化標準的過渡性方案. 在 過渡的過程中, 中 文平臺可能會和國際化標準共同存在一段時間. 以CLE和TurboLinux?例, 它們在早期的版本中都採用了中文平臺來 支援中文的 顯示和輸入, 隨著支援國際化標準的軟體的增多, 逐步採用了 中文平臺和國際化 標準共同存在的版本作?過渡性版本. 到目前?止, 已經 在缺省情況下放棄中文 平臺的使用. 中文平臺只是作?殘留物包含在發佈 版本中. 4. Linux 文檔中文化 Linux文檔, 主要是指Linux上的一些命令幫助文檔(man文件), 軟體 手冊和說明, 軟體本身的Message文件(po). 目前在這方面的工作還缺乏 統一的管理和廣大 Linux愛好者的參與. 參考資料 * Unicode: http://www.unicode.org/ * 香港增補字元集: http://www.digital21.gov.hk/chi/hkscs/introduction.html * CJK 有關資訊: ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf * Linux國際化資料: http://i18n.linux.org.tw/ * Linux國際化標準: http://www.li18nux.org/. http:// * MicroSoft 國際化: http://www.microsoft.com/globaldev/ 六 附錄 1. 寬字元處理函數函數與普通函數對照表 字元分類: 寬字元函數 普通C函數 描述 iswalnum() isalnum() 測試字元是否?數位或字母 iswalpha() isalpha() 測試字元是否是字母 iswcntrl() iscntrl() 測試字元是否是控制符 iswdigit() isdigit() 測試字元是否?數位 iswgraph() isgraph() 測試字元是否是可見字元 iswlower() islower() 測試字元是否是小寫字元 iswprint() isprint() 測試字元是否是可列印字元 iswpunct() ispunct() 測試字元是否是標點符號 iswspace() isspace() 測試字元是否是空白符號 iswupper() isupper() 測試字元是否是大寫字元 iswxdigit() isxdigit() 測試字元是否是十六進位的數位 大小寫轉換: 寬字元函數 普通C函數 描述 towlower() tolower() 把字元轉換?小寫 towupper() toupper() 把字元轉換?大寫 字元比較: 寬字元函數 普通C函數 描述 wcscoll() strcoll() 比較字串 日期和時間轉換: 寬字元函數 描述 strftime() 根據指定的字串格式和locale設置格式 化日期和時間 wcsftime() 根據指定的字串格式和locale設置格式 化日期和時間, 並返回寬字串 strptime() 根據指定格式把字串轉換?時間值, 是strftime的反過程 列印和掃描字串: 寬字元函數 描述 fprintf()/fwprintf() 使用vararg參量的格式化輸出 fscanf()/fwscanf() 格式化讀入 printf() 使用vararg參量的格
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-25 19:36:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!