中国韩国日本在线观看免费,A级尤物一区,日韩精品一二三区无码,欧美日韩少妇色

當(dāng)前位置:主頁(yè) > 科技論文 > 軟件論文 >

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

發(fā)布時(shí)間:2015-02-11 21:12

摘 要:

摘 要:本文對(duì)UNICODE字符集作詳細(xì)介紹,并對(duì)基于Window 2000以上的WIN32操作系統(tǒng)在Visual C++編程環(huán)境下實(shí)現(xiàn)軟件的多國(guó)語(yǔ)言作詳細(xì)論述。

關(guān)鍵詞:

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

     對(duì)于中東等非英語(yǔ)國(guó)家的地區(qū),用戶(hù)經(jīng)常要編寫(xiě)雙語(yǔ)或多語(yǔ)操作界面。并且從Windows NT操作系統(tǒng)后,即使輸入的MBCS字符,操作系統(tǒng)也要轉(zhuǎn)換為UNICODE字符,并且有必要輸出時(shí)還要經(jīng)過(guò)一次UNICODE到MBCS字符集的轉(zhuǎn)換,雖然系統(tǒng)已經(jīng)做了極大的優(yōu)化,但還是有速度損失的。鑒于此,UNICODE編程似乎勢(shì)在必行。


1 UNICODE概述

     UNICODE 是目前用來(lái)解決 ASCII 碼 256 個(gè)字符限制問(wèn)題的一種比較流行的解決方案。ASCII 字符集只有256個(gè)字符,用 0-255 之間的數(shù)字來(lái)表示。包括大小寫(xiě)字母、數(shù)字以及少數(shù)特殊字符;如標(biāo)點(diǎn)符號(hào)、貨幣符號(hào)等。對(duì)于大多數(shù)拉丁語(yǔ)言來(lái)說(shuō),這些字符已經(jīng)夠用。但是,許多亞洲和東方語(yǔ)言所用的字符遠(yuǎn)遠(yuǎn)不止256個(gè)字符,有些甚至超過(guò)萬(wàn)個(gè)。為了突破 ASCII 碼字符數(shù)的限制,試圖用一種簡(jiǎn)單的方法來(lái)針對(duì)超過(guò)256個(gè)字符的語(yǔ)言編寫(xiě)計(jì)算機(jī)程序,于是 UNICODE 應(yīng)運(yùn)而生。


2 字符編碼

     第一種編碼類(lèi)型是單子節(jié)字符集SBCS(single-byte character set)。在這種編碼模式下,所有的字符都只用一個(gè)字節(jié)表示。ASCII是SBCS。一個(gè)字節(jié)表示的0用來(lái)標(biāo)志SBCS字符串的結(jié)束符。

     第二種編碼模式是多字節(jié)字符集MBCS(multi-byte character set)。一個(gè)MBCS編碼包含一些一個(gè)字節(jié)長(zhǎng)的字符,而另一些字符大于一個(gè)字節(jié)的長(zhǎng)度。用在Windows里的MBCS包含兩種字符類(lèi)型,單字節(jié)字符SBCS(single-byte characters set)和雙字節(jié)字符DBCS(double-byte characters set)。由于Windows里使用的多字節(jié)字符絕大部分是兩個(gè)字節(jié)長(zhǎng),所以MBCS常被用DBCS代替。

     在DBCS編碼模式中,一些特定的值被保留用來(lái)表明它們是雙字節(jié)字符的一部分。例如,中文在GB2312編碼中,一個(gè)大于0x7f的特定范圍內(nèi)的值表示這是一個(gè)雙字節(jié)字符,緊跟著的下一個(gè)子節(jié)是這個(gè)字符的一部分。第一個(gè)值被稱(chēng)作"leading bytes"。跟隨在一個(gè)leading byte子節(jié)后面的字節(jié)被稱(chēng)作"trail byte"。在DBCS中,trail byte可以是任意非0值。例如,在GB2312編碼集中,“論”的“l(fā)eading bytes”為“0xCB”, “trail byte”為“0xDB”。同SBCS一樣,DBCS字符串的結(jié)束標(biāo)志也是一個(gè)單字節(jié)表示的0。

     第三種編碼模式是Unicode。Unicode是一種所有的字符都使用兩個(gè)字節(jié)編碼的編碼模式。Unicode字符有時(shí)也被稱(chēng)作寬字符,因?yàn)樗葐巫庸?jié)字符寬(使用了更多的存儲(chǔ)空間)!罢摗钡腢NICODE編碼為0x8bba。注意,Unicode不能被看作MBCS。MBCS的獨(dú)特之處在于它的字符使用不同長(zhǎng)度的字節(jié)編碼。Unicode字符串使用兩個(gè)字節(jié)表示的0作為它的結(jié)束標(biāo)志。


3 UNICODE編程的實(shí)現(xiàn)

    本節(jié)結(jié)合制作英文/阿拉伯文雙語(yǔ)界面來(lái)討論利用UNICODE編程的具體實(shí)現(xiàn)過(guò)程。

3.1 字符串的定義

     對(duì)于MBCS編程,定義一個(gè)字符串的常用格式:

     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++定義了一個(gè)“新”的數(shù)據(jù)類(lèi)型TCHAR,這個(gè)類(lèi)型會(huì)根據(jù)預(yù)處理宏指令轉(zhuǎn)換為相應(yīng)得字符集所需類(lèi)型,也就是若定義了UNICODE,_UNICODE預(yù)處理宏指令了的話(huà),TCAHR就是wchar_t,若定義了MBCS,_MBCS的話(huà)他就是char。同樣,MBCS字符串處理函數(shù)str*(…)都用_tcs*(…)替代,這樣就為編程帶來(lái)極大的方便。

     相應(yīng)的,字符串常量用_T()或TEXT()重寫(xiě)。

     例如_T(“hello!”)或TEXT(“hello!”);

     或者直接在字符串常量前加L,例如L”hello!”。

     下表是數(shù)據(jù)類(lèi)型在不同的編譯環(huán)境下所對(duì)應(yīng)的類(lèi)型。

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


3.2 編譯器設(shè)置和文件存儲(chǔ)方式

3.2.1 編譯器設(shè)置

     利用UNICODE編程必須定義UNICODE,_UNICODE預(yù)處理宏指令,注意,這里的 UNICODE 和 _UNICODE 必須都要定義,那它們有什么區(qū)別呢?前者沒(méi)有下劃線(xiàn),專(zhuān)門(mén)用于 Windows 頭文件;后者有一個(gè)前綴下劃線(xiàn),專(zhuān)門(mén)用于 C 運(yùn)行時(shí)頭文件。

3.2.2 文件存儲(chǔ)格式

     如果在源文件中出現(xiàn)阿拉伯文就必須將存為UNICODE格式,否則文件在下一次打開(kāi)后輸入阿文的地方會(huì)出現(xiàn)“?”,就是說(shuō)如果文件存為ASCII的話(huà),存儲(chǔ)的阿文字符無(wú)法識(shí)別。

     在Visual C++ 6.0的存儲(chǔ)格式?jīng)]有UNICODE存儲(chǔ)格式,可以用記事本等文本編輯工具將源文件打開(kāi)選擇另存,并在格式康寶框中把格式選為Unicode即可。對(duì)于Visual C++ 7.0以上版本,在IDE中另存該文件并選擇編碼UNICODE(代碼頁(yè)1200)保存即可。

3.3 雙語(yǔ)界面的實(shí)現(xiàn)

     古老的方法是判斷程序中一個(gè)語(yǔ)言標(biāo)志變量,例如g_lang,利用該變量動(dòng)態(tài)的更改控件、對(duì)話(huà)框等資源的英/阿文的顯示,這對(duì)于大型軟件來(lái)說(shuō)工作量是相當(dāng)大的。幸好,微軟提供了純資源的動(dòng)態(tài)鏈接庫(kù),只要將資源文件編譯成英文的動(dòng)態(tài)鏈接庫(kù)eng.dll和阿文的動(dòng)態(tài)鏈接庫(kù)arb.dll,這樣在切換語(yǔ)言是卸載當(dāng)前庫(kù),加載另一個(gè)語(yǔ)言庫(kù)就完成了雙語(yǔ)的實(shí)時(shí)切換。須在應(yīng)用程序類(lèi)的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);

這樣就實(shí)現(xiàn)了語(yǔ)言庫(kù)的加載。并用代碼在語(yǔ)言實(shí)時(shí)切換處動(dòng)態(tài)卸載,加載所需庫(kù)即可。

  阿文純資源的動(dòng)態(tài)鏈接庫(kù)的編寫(xiě)比較麻煩,因?yàn)閂isual C++的資源編輯器不支持UNICODE的字符輸入。用記事本或其它文本編輯軟件打開(kāi)工程目錄下的資源文件(擴(kuò)展名為rc)仔細(xì)查看,發(fā)現(xiàn)都有code_page的定義,也就是說(shuō),它采用的是MBCS編碼,根據(jù)不同的代碼頁(yè),將字符串轉(zhuǎn)化為當(dāng)前代碼頁(yè)所對(duì)應(yīng)的字符串。例如,當(dāng)code_page為1252(中文代碼頁(yè))時(shí),“論”顯示的就是“論”,而在code_page為936(英文代碼頁(yè))時(shí),,他將顯示的是亂碼。阿文(阿爾及利亞)的代碼是1256。

  這就需要兩個(gè)WIN APIs 函數(shù)WideCharToMultiByte和MultiByteToWideChar,前者是將UNICODE轉(zhuǎn)化為MBCS,后者恰好相反,具體參數(shù)請(qǐng)參考MSDN。筆者作了個(gè)小裝換程序,在一個(gè)編輯框中輸入阿拉伯文(此時(shí)編碼為UNICODE),點(diǎn)擊轉(zhuǎn)換按鈕后轉(zhuǎn)化為該段阿拉伯字符的MBCS編碼,將這段“亂碼”copy到資源編輯器的相對(duì)應(yīng)的英文的位置上,即可正常顯示阿文了。


4 結(jié)語(yǔ)

  綜上所述可以看到,編譯 UNICODE 版本的程序并不難,只是在編寫(xiě)代碼時(shí)記住函數(shù)調(diào)用上細(xì)微的變化。微軟為此提供的擴(kuò)展使開(kāi)發(fā)人員能夠以透明的方式選擇所用的字符集,為應(yīng)用軟件的國(guó)際化打開(kāi)了方便之門(mén)。



本文編號(hào):14747

資料下載
論文發(fā)表

本文鏈接:http://www.lk138.cn/kejilunwen/ruanjiangongchenglunwen/14747.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶(hù)bf605***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com