天天看點

軟體國際化的思考

  元旦這幾天都在睡夢中度過了,隻正經地思考了一件事,就是軟體國際化的問題。

  國際化(Internationalization,這個又長又醜的單詞,= =#) ,也被稱為I18n,技術一點來講就是準備讓軟體支援多個區域文化(語言)的活動。這個問題在過去的一年也曾思考過,在國内這是一個非常頭痛的問題。對于一般軟體來說,軟體支援中文,這是一個很不錯的亮點。但對于一些高端的産品來說,特别是同類産品都沒有支援中文的時候,我們就很擔心,一旦支援了中文,會不會對未來使用者對我們的産品的印象帶來不好的影響。

  這幾天雲風在他的部落格中就提到這個問題,當然,他們已經不是思考要不要用進行國際化的問題了,而是總結在使用 Unicode 過程中的一些經驗。

  于是,這兩天重新對國際化這個問題進行思考,想想如果不國際化的時候應該注意哪些問題,如果産品要國際化的時候要注意哪些問題。

  事實上,國際化要考慮地問題很多,包括大量的狀态提示、幫助資訊、錯誤資訊,等等。這就要估算這些 String 所用到的資源,如何組織不同的語言,何時确定使用哪種語言,還有使用何種字元集(Unicode、ISO8859、GBK、GB18030,等等),一旦有了改變,以前的資料怎麼辦?這些都是非常複雜的問題,都得從架構層次上來考慮。是以,很認為雲風所講的, VC 提倡的所謂為軟體維護 UNICODE 和 非 UNICODE 兩個版本是件巨傻 X 的事情。

  以下是翻閱了《代碼大全》之後思考的總結:

  1. 如果你知道隻需要支援一種文字的語言,請考慮使用 ISO8859 字元集。
  2. 如果你需要支援多種語言,請使用 Unicode。
  3. 采用某種一緻的字元串類型轉換政策。 也就是字元串在程式内部統一使用一種字元集,同時盡可能地靠近輸入和輸出操作的位置轉換成其他格式。

  其實,我個人的看法,軟體應該從架構上支援國際化,現在很多國際化的方案都是把本地化跟程式設計分離開來的,比如 GNU Gettext,對開發不會有多大的影響。同時,擔心上了中文會影響使用者的印象,其實是對自己的不自信。綜觀發展,其實中文程式是未來一段時候一個不小的市場,有誰願意用起軟體來,在手旁還要放塊字典來的。然而,也隻有中國人才能了解中國人,自己都不做,心裡覺得怪怪的。

  

ASCII to Unicode:
  1. 添加 UNICODE,_UNICODE 預處理定義:Project Settings -> C/C++ -> Preprocessor definitions
  2. 将 Project Settings -> Link -> CateGory:Output -> Entry Point 設為 wWinMainCRTStartup
  3. 對字元串常量使用字首L: L"String"
  4. 使用寬字元相關類型,如:char -> TCHAR、char * -> LPTSTR、const char * -> LPCTSTR
  5. 替換C庫中的中字元串操作函數,如 strlen -> _tcslen、strcmp -> _tcscmp 等

    類似的還有C庫中字元串與數字的轉換函數,如 atoi -> _ttoi、itoa -> _itot 等

  6. 對于仍需使用ANSI字元串的地方,如第三方類庫的接口,仍可繼續使用;如需進行Unicode字元串和ANSI字元串的互轉換,可使用 MultiByteToWideChar 和 WideCharToMultiByte

  相當參考:

     Unicode and Multibyte Character Set (MBCS) Support

繼續閱讀