--------------------------------------------------------------------------
國際化、本地化和中文化
國際化、本地化和多語言化的概念
中文化
X11 國際化的歷史和級別
國際化標准組織
國際化的意義
Locale Locale 的概念 在X中使用Locale 文化習俗的差別
X 窗口系統的國際化 顯示的國際化 字符集和編碼 多字節字符(Multibyte)和寬字符(WideChar)的使用 Unicode 字體(Font)和字體集(FontSet) 信息的國際化 輸入的國際化 打印的國際化 客戶程序間通訊的國際化
開發符合國際化標准的軟件 開發國際化軟件 使非國際化軟件國際化
目前中文化中存在的問題 編碼動態切換的問題 中文編碼自動識別問題 Linux上的中文平台到國際化的過渡
附錄
寬字符處理函數函數與普通函數對照表
X 窗口系統下支持中文的函數庫
支持多語言的典型軟件
支持Unicode的軟件
--------------------------------------------------------------------------
五 目前中文化中存在的問題
現有的國際化標准中存在許多問題, 問題的原因主要出自目前的 國際化架構. 對於中 文化來說, 這些問題顯得更加突出.
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參量的格式化輸出到標准輸出 scanf() 從標准輸入的格式化讀入 sprintf()/swprintf() 根據vararg參量表格式化成字符串 sscanf() 以字符串作格式化讀入 vfprintf()/vfwprintf() 使用stdarg參量表格式化輸出到文件 vprintf() 使用stdarg參量表格式化輸出到標准輸出 vsprintf()/vswprintf() 格式化stdarg參量表並寫到字符串
數字轉換:
寬字符函數 普通C函數 描述 wcstod() strtod() 把寬字符的初始部分轉換為雙精度浮點數 wcstol() strtol() 把寬字符的初始部分轉換為長整數 wcstoul() strtoul() 把寬字符的初始部分轉換為無符號長整數
多字節字符和寬字符轉換及操作:
寬字符函數 描述 mblen() 根據locale的設置確定字符的字節數 mbstowcs() 把多字節字符串轉換為寬字符串 mbtowc()/btowc() 把多字節字符轉換為寬字符 wcstombs() 把寬字符串轉換為多字節字符串 wctomb()/wctob() 把寬字符轉換為多字節字符 輸入和輸出:
寬字符函數 普通C函數 描述 fgetwc() fgetc() 從流中讀入一個字符並轉換為寬字符 fgetws() fgets() 從流中讀入一個字符串並轉換為寬字符串 fputwc() fputc() 把寬字符轉換為多字節字符並且輸出到標 准輸出 fputws() fputs() 把寬字符串轉換為多字節字符並且輸出到 標准輸出串 getwc() getc() 從標准輸入中讀取字符, 並且轉換為寬字 符 getwchar() getchar() 從標准輸入中讀取字符, 並且轉換為寬字 符 None gets() 使用fgetws() putwc() putc() 把寬字符轉換成多字節字符並且寫到標准 輸出 putwchar() getchar() 把寬字符轉換成多字節字符並且寫到標准 輸出 None puts() 使用fputws() ungetwc() ungetc() 把一個寬字符放回到輸入流中
字符串操作:
寬字符函數 普通C函數 描述 wcscat() strcat() 把一個字符串接到另一個字符串的尾部 wcsncat() strncat() 類似於wcscat(), 而且指定粘接字符串的 粘接長度. wcschr() strchr() 查找子字符串的第一個位置 wcsrchr() strrchr() 從尾部開始查找子字符串出現的第一個位 置 wcspbrk() strpbrk() 從一字符字符串中查找另一字符串中任何 一個字符第一次出現的位置 wcswcs()/wcsstr() strchr() 在一字符串中查找另一字符串第一次出現 的位置 wcscspn() strcspn() 返回不包含第二個字符串的的初始數目 wcsspn() strspn() 返回包含第二個字符串的初始數目 wcscpy() strcpy() 拷貝字符串 wcsncpy() strncpy() 類似於wcscpy(), 同時指定拷貝的數目 wcscmp() strcmp() 比較兩個寬字符串 wcsncmp() strncmp() 類似於wcscmp(), 還要指定比較字符字符 串的數目 wcslen() strlen() 獲得寬字符串的數目
wcstok() strtok() 根據標示符把寬字符串分解成一系列字符 串 wcswidth() None 獲得寬字符串的寬度 wcwidth() None 獲得寬字符的寬度
另外還有對應於memory操作的 wmemcpy(), wmemchr(), wmemcmp(), wmemmove(), wmemset(). 2. X 窗口系統下支持中文的函數
支持西文的函數 支持中文的函數 描述 XLoadFont XCreateFontSet 載入字體集
XTextExtents(16) Xmb/wcTextExtents 返回文本的限制框 Xmb/wcTextPerCharExtents XDrawString Xmb/wcDrawString 在窗口中畫字符串, 背景填充 XDrawImageString Xmb/wcDrawImageString 在窗口中畫字符串 XDrawText Xmb/wcDrawText 在窗口中畫字符串 XLookupString Xmb/wcLookupString 查找字符串
3. 支持國際化的高層庫 o OSF/Motif o Qt/kdelib o gtk+/gnome-lib o Perl o Java 4. 支持多語言的典型軟件 o 浏覽器 Netscape o 編輯器 XEmacs o 編輯器 Mule o 編輯器 vim o 終端 rxvt o 排版軟件 LaTeX/lyx o PostScript/PDF: gs/acroread o 圖像處理: gimp o 幻燈片制作 mgp o 即將完成: StarOffice, KOffice 5. 支持Unicode的軟件 o 高級圖形庫函數 Qt 2.x o Java 語言開發工具 JDK o 編輯器 yudit o 專用的支持Unicode的 X 終端 o 基於GTK+的文本處理器 GScript
(全文完)
相關鏈接: Linux 國際化本地化和中文化(四)