天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

當(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ó)語言作詳細(xì)論述。

關(guān)鍵詞:

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

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


1 UNICODE概述

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


2 字符編碼

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

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

     在DBCS編碼模式中,一些特定的值被保留用來表明它們是雙字節(jié)字符的一部分。例如,中文在GB2312編碼中,一個(gè)大于0x7f的特定范圍內(nèi)的值表示這是一個(gè)雙字節(jié)字符,緊跟著的下一個(gè)子節(jié)是這個(gè)字符的一部分。第一個(gè)值被稱作"leading bytes"。跟隨在一個(gè)leading byte子節(jié)后面的字節(jié)被稱作"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í)也被稱作寬字符,因?yàn)樗葐巫庸?jié)字符寬(使用了更多的存儲(chǔ)空間)。“論”的UNICODE編碼為0x8bba。注意,Unicode不能被看作MBCS。MBCS的獨(dú)特之處在于它的字符使用不同長(zhǎng)度的字節(jié)編碼。Unicode字符串使用兩個(gè)字節(jié)表示的0作為它的結(jié)束標(biāo)志。


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

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

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ù)類型TCHAR,這個(gè)類型會(huì)根據(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)境下所對(duì)應(yīng)的類型。

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


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

3.2.1 編譯器設(shè)置

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

3.2.2 文件存儲(chǔ)格式

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

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

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

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

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

  阿文純資源的動(dòng)態(tài)鏈接庫(kù)的編寫比較麻煩,因?yàn)閂isual C++的資源編輯器不支持UNICODE的字符輸入。用記事本或其它文本編輯軟件打開工程目錄下的資源文件(擴(kuò)展名為rc)仔細(xì)查看,發(fā)現(xiàn)都有code_page的定義,也就是說,它采用的是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é)語

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



本文編號(hào):14747

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

本文鏈接:http://sikaile.net/kejilunwen/ruanjiangongchenglunwen/14747.html


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

版權(quán)申明:資料由用戶bf605***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com
丁香六月婷婷基地伊人| 国内真实露脸偷拍视频| 日本福利写真在线观看| 99久久精品国产日本| 日本欧美一区二区三区在线播| 欧美尤物在线观看西比尔| 欧美色欧美亚洲日在线| 久久三级国外久久久三级| 手机在线不卡国产视频| 亚洲精品国产福利在线| 视频一区二区黄色线观看| 91在线爽的少妇嗷嗷叫| 亚洲精品日韩欧美精品| 中文字幕禁断介一区二区| 九九热精品视频免费观看| 亚洲国产精品久久综合网| 东京干男人都知道的天堂| 欧美亚洲国产日韩一区二区| 在线观看视频成人午夜| 中文字幕久热精品视频在线| 日本免费一区二区三女| 初尝人妻少妇中文字幕在线| 麻豆视传媒短视频免费观看| 在线视频三区日本精品| 91欧美视频在线观看免费| 大香蕉伊人一区二区三区| 成人国产一区二区三区精品麻豆 | 亚洲视频偷拍福利来袭| 日本高清一道一二三区四五区| 午夜视频成人在线观看| 日本免费一本一二区三区| 亚洲国产色婷婷久久精品| 激情爱爱一区二区三区| 久久成人国产欧美精品一区二区 | 国产亚洲精品俞拍视频福利区| 老司机精品在线你懂的| 亚洲高清欧美中文字幕| 国产精品福利精品福利| 日本 一区二区 在线| 在线懂色一区二区三区精品| 久草视频在线视频在线观看|