欧美日操-欧美日韩91-欧美日韩99-欧美日韩ay在线观看-xxxx色-xxxx视频在线

UNICODE編程實現軟件的國際化

2014-10-07 15:36:12 大云網  點擊量: 評論 (0)
摘 要:本文對UNICODE字符集作詳細介紹,并對基于Window 2000以上的WIN32操作系統在Visual C++編程環境下實現軟件的多國語言作詳細論述。關鍵詞:UNICODE 編碼 MBCS SBCS 對于中東等非英語國家的地區,
摘 要:本文對UNICODE字符集作詳細介紹,并對基于Window 2000以上的WIN32操作系統在Visual C++編程環境下實現軟件的多國語言作詳細論述。

關鍵詞:UNICODE 編碼 MBCS SBCS

 

     對于中東等非英語國家的地區,用戶經常要編寫雙語或多語操作界面。并且從Windows NT操作系統后,即使輸入的MBCS字符,操作系統也要轉換為UNICODE字符,并且有必要輸出時還要經過一次UNICODE到MBCS字符集的轉換,雖然系統已經做了極大的優化,但還是有速度損失的。鑒于此,UNICODE編程似乎勢在必行。
 
1 UNICODE概述
     UNICODE 是目前用來解決 ASCII 碼 256 個字符限制問題的一種比較流行的解決方案。ASCII 字符集只有256個字符,用 0-255 之間的數字來表示。包括大小寫字母、數字以及少數特殊字符;如標點符號、貨幣符號等。對于大多數拉丁語言來說,這些字符已經夠用。但是,許多亞洲和東方語言所用的字符遠遠不止256個字符,有些甚至超過萬個。為了突破 ASCII 碼字符數的限制,試圖用一種簡單的方法來針對超過256個字符的語言編寫計算機程序,于是 UNICODE 應運而生。
 
2 字符編碼
     第一種編碼類型是單子節字符集SBCS(single-byte character set)。在這種編碼模式下,所有的字符都只用一個字節表示。ASCII是SBCS。一個字節表示的0用來標志SBCS字符串的結束符。
     第二種編碼模式是多字節字符集MBCS(multi-byte character set)。一個MBCS編碼包含一些一個字節長的字符,而另一些字符大于一個字節的長度。用在Windows里的MBCS包含兩種字符類型,單字節字符SBCS(single-byte characters set)和雙字節字符DBCS(double-byte characters set)。由于Windows里使用的多字節字符絕大部分是兩個字節長,所以MBCS常被用DBCS代替。
     在DBCS編碼模式中,一些特定的值被保留用來表明它們是雙字節字符的一部分。例如,中文在GB2312編碼中,一個大于0x7f的特定范圍內的值表示這是一個雙字節字符,緊跟著的下一個子節是這個字符的一部分。第一個值被稱作"leading bytes"。跟隨在一個leading byte子節后面的字節被稱作"trail byte"。在DBCS中,trail byte可以是任意非0值。例如,在GB2312編碼集中,“論”的“leading bytes”為“0xCB”, “trail byte”為“0xDB”。同SBCS一樣,DBCS字符串的結束標志也是一個單字節表示的0。
     第三種編碼模式是Unicode。Unicode是一種所有的字符都使用兩個字節編碼的編碼模式。Unicode字符有時也被稱作寬字符,因為它比單子節字符寬(使用了更多的存儲空間)。“論”的UNICODE編碼為0x8bba。注意,Unicode不能被看作MBCS。MBCS的獨特之處在于它的字符使用不同長度的字節編碼。Unicode字符串使用兩個字節表示的0作為它的結束標志。
 
3 UNICODE編程的實現
    本節結合制作英文/阿拉伯文雙語界面來討論利用UNICODE編程的具體實現過程。
3.1 字符串的定義
     對于MBCS編程,定義一個字符串的常用格式:
     char buf[100];
  字符串的拷貝函數下面這樣聲明函數原形:
       void strcpy( char *out, char *in );
  為了將上面的聲明改成支持雙字節的 UNICODE 字符集,可以用下面的方法:
       wchar_t str[100]; 
     相應的字符串的拷貝函數下面這樣聲明函數原形:
     void wcscpy ( wchar_t *out, wchar_t *in );
     這樣定義顯然比較麻煩,有幸的是Visual C++定義了一個“新”的數據類型TCHAR,這個類型會根據預處理宏指令轉換為相應得字符集所需類型,也就是若定義了UNICODE,_UNICODE預處理宏指令了的話,TCAHR就是wchar_t,若定義了MBCS,_MBCS的話他就是char。同樣,MBCS字符串處理函數str*(…)都用_tcs*(…)替代,這樣就為編程帶來極大的方便。
     相應的,字符串常量用_T()或TEXT()重寫。
     例如_T(“hello!”)或TEXT(“hello!”);
     或者直接在字符串常量前加L,例如L”hello!”。
     下表是數據類型在不同的編譯環境下所對應的類型。
3.2 編譯器設置和文件存儲方式
3.2.1 編譯器設置
     利用UNICODE編程必須定義UNICODE,_UNICODE預處理宏指令,注意,這里的 UNICODE 和 _UNICODE 必須都要定義,那它們有什么區別呢?前者沒有下劃線,專門用于 Windows 頭文件;后者有一個前綴下劃線,專門用于 C 運行時頭文件。
3.2.2 文件存儲格式
     如果在源文件中出現阿拉伯文就必須將存為UNICODE格式,否則文件在下一次打開后輸入阿文的地方會出現“?”,就是說如果文件存為ASCII的話,存儲的阿文字符無法識別。
     在Visual C++ 6.0的存儲格式沒有UNICODE存儲格式,可以用記事本等文本編輯工具將源文件打開選擇另存,并在格式康寶框中把格式選為Unicode即可。對于Visual C++ 7.0以上版本,在IDE中另存該文件并選擇編碼UNICODE(代碼頁1200)保存即可。
3.3 雙語界面的實現
     古老的方法是判斷程序中一個語言標志變量,例如g_lang,利用該變量動態的更改控件、對話框等資源的英/阿文的顯示,這對于大型軟件來說工作量是相當大的。幸好,微軟提供了純資源的動態鏈接庫,只要將資源文件編譯成英文的動態鏈接庫eng.dll和阿文的動態鏈接庫arb.dll,這樣在切換語言是卸載當前庫,加載另一個語言庫就完成了雙語的實時切換。須在應用程序類的InitInstance函數中加入如下代碼:
     if(g_lang=='a') //阿文界面
         m_hInstRes=::LoadLibrary(L"arb.dll");
     else          //英文界面
         m_hInstRes=::LoadLibrary(L"eng.dll");
     if (m_hInstRes == NULL)
     {
        AfxMessageBox(L"Cannot open Resource file(dll).");
        return FALSE; // failed to load the localized resources  
     }  
       else
       {
         AfxSetResourceHandle(m_hInstRes); // get resources from the DLL
       }
  在ExitInstance()函數中加入:
   if(m_hInstRes)
        ::FreeLibrary(m_hInstRes);
這樣就實現了語言庫的加載。并用代碼在語言實時切換處動態卸載,加載所需庫即可。
  阿文純資源的動態鏈接庫的編寫比較麻煩,因為Visual C++的資源編輯器不支持UNICODE的字符輸入。用記事本或其它文本編輯軟件打開工程目錄下的資源文件(擴展名為rc)仔細查看,發現都有code_page的定義,也就是說,它采用的是MBCS編碼,根據不同的代碼頁,將字符串轉化為當前代碼頁所對應的字符串。例如,當code_page為1252(中文代碼頁)時,“論”顯示的就是“論”,而在code_page為936(英文代碼頁)時,他將顯示的是亂碼。阿文(阿爾及利亞)的代碼是1256。
  這就需要兩個WIN APIs 函數WideCharToMultiByte和MultiByteToWideChar,前者是將UNICODE轉化為MBCS,后者恰好相反,具體參數請參考MSDN。筆者作了個小裝換程序,在一個編輯框中輸入阿拉伯文(此時編碼為UNICODE),點擊轉換按鈕后轉化為該段阿拉伯字符的MBCS編碼,將這段“亂碼”copy到資源編輯器的相對應的英文的位置上,即可正常顯示阿文了。
 
4 結語
  綜上所述可以看到,編譯 UNICODE 版本的程序并不難,只是在編寫代碼時記住函數調用上細微的變化。微軟為此提供的擴展使開發人員能夠以透明的方式選擇所用的字符集,為應用軟件的國際化打開了方便之門。
大云網官方微信售電那點事兒

責任編輯:葉雨田

免責聲明:本文僅代表作者個人觀點,與本站無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
?
主站蜘蛛池模板: 青青自拍视频一区二区三区| 亚洲综合日韩欧美一区二区三| 亚洲精品乱码久久久久久v| 亚洲精品123区| 青青草国产成人久久91网| 性激烈的欧美三级高清视频| 人人插人人爽| 日韩aa在线观看| 亚洲女性色尼古综合网| 欧洲性大片xxxxx久久久| 欧美色性| 亚洲欧美中文字幕高清在线一| 日韩一区视频在线| 亚洲一区二区色| 午夜看黄| 青青啪| 欧美成人第一页| 小说区 亚洲 自拍 另类| 亚洲激情第二页| 午夜毛片免费看| 色94色欧美一区| 特黄特色一级特色大片中文| 午夜精品久久久久久久99热浪潮| 午夜国产福利在线观看| 欧美亚洲动漫| 无限观看社区在线视频| 青草视频免费看| 欧美一级大片在线观看| 日本jjzz| 日韩一级一欧美一级国产| 亚洲精品国产专区91在线| 日韩区欧美区| 偷窥 国产 综合| 亚洲欧美日韩不卡| 亚洲精品乱码久久久久久v| 三级观看| 欧日韩在线不卡视频| 欧美天天| 亚洲精品在线观看91| 亚洲男女免费视频| 日本综合欧美一区二区三区|