UNICODE編程實現(xiàn)軟件的國際化
摘 要:本文對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)用軟件的國際化打開了方便之門。
責(zé)任編輯:葉雨田
免責(zé)聲明:本文僅代表作者個人觀點,與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實,對本文以及其中全部或者部分內(nèi)容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關(guān)內(nèi)容。
我要收藏
個贊
-
現(xiàn)貨模式下谷電用戶價值再評估
2020-10-10電力現(xiàn)貨市場,電力交易,電力用戶 -
PPT | 高校綜合能源服務(wù)有哪些解決方案?
2020-10-09綜合能源服務(wù),清潔供熱,多能互補(bǔ) -
深度文章 | “十三五”以來電力消費增長原因分析及中長期展望
2020-09-27電力需求,用電量,全社會用電量
-
PPT | 高校綜合能源服務(wù)有哪些解決方案?
2020-10-09綜合能源服務(wù),清潔供熱,多能互補(bǔ) -
深度文章 | “十三五”以來電力消費增長原因分析及中長期展望
2020-09-27電力需求,用電量,全社會用電量 -
我國電力改革涉及的電價問題
-
電化學(xué)儲能應(yīng)用現(xiàn)狀及對策研究
2019-08-14電化學(xué)儲能應(yīng)用 -
《能源監(jiān)測與評價》——能源系統(tǒng)工程之預(yù)測和規(guī)劃
-
《能源監(jiān)測與評價》——能源系統(tǒng)工程之基本方法
-
貴州職稱論文發(fā)表選擇泛亞,論文發(fā)表有保障
2019-02-20貴州職稱論文發(fā)表 -
《電力設(shè)備管理》雜志首屆全國電力工業(yè) 特約專家征文
2019-01-05電力設(shè)備管理雜志 -
國內(nèi)首座蜂窩型集束煤倉管理創(chuàng)新與實踐
-
人力資源和社會保障部:電線電纜制造工國家職業(yè)技能標(biāo)準(zhǔn)
-
人力資源和社會保障部:變壓器互感器制造工國家職業(yè)技能標(biāo)準(zhǔn)
-
《低壓微電網(wǎng)并網(wǎng)一體化裝置技術(shù)規(guī)范》T/CEC 150
2019-01-02低壓微電網(wǎng)技術(shù)規(guī)范
-
現(xiàn)貨模式下谷電用戶價值再評估
2020-10-10電力現(xiàn)貨市場,電力交易,電力用戶 -
建議收藏 | 中國電價全景圖
2020-09-16電價,全景圖,電力 -
一張圖讀懂我國銷售電價附加
2020-03-05銷售電價附加