www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

UNICODE編程實現(xiàn)軟件的國際化

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

關(guān)鍵詞:UNICODE 編碼 MBCS SBCS

 

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

責(zé)任編輯:葉雨田

免責(zé)聲明:本文僅代表作者個人觀點,與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,對本文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關(guān)內(nèi)容。
我要收藏
個贊
?
主站蜘蛛池模板: 国产美女精品三级在线观看 | 99re热在线视频| 日韩免费观看一级毛片看看| 久久福利资源国产精品999| 成 人 a v免费视频| 日韩国产中文字幕| www黄网站| 免费国内精品久久久久影院| 国产成版人视频网站免费下| 亚洲经典在线观看| 国产在线观看成人| 日韩免费一级毛片| 国产欧美日韩综合一区二区三区| 制服诱惑中文字幕| 另类亚洲孕妇分娩网址| 一级欧美在线的视频| 久久厕所精品国产精品亚洲| a级毛片免费高清毛片视频| 欧美日韩在线观看区一二| 曰韩一级| 国产亚洲精品日韩已满十八| 亚洲精品欧美精品一区二区| 国产不卡毛片| 久久久久久久久网站| 亚洲免费在线| 厕拍精品| 国产一区二区三区四区在线观看| 亚洲成年www| 一级做a爱片特黄在线观看免费看| 国产亚洲精品一区二区三区| 日韩久草| 生活片毛片| 99视频国产在线| 九九视频在线观看视频| 免费特级毛片| 亚洲成成品网站有线| 一级美国乱色毛片| 国产成人精品福利站| 久久精品呦女| 久久精品国产国产精品四凭| 日韩精品一区二三区中文|