在VC6.0下設置Unicode編譯環境

【前言1】最近又要忙一陣C代碼了。忙起來,總比閒着好,尤其是我這種沒壓力沒動力的豬頭。

 

【前言2】遇到一個問題:下面的代碼發送出去的消息是亂碼,起初懷疑是沒有memset,但是發現即使初始化後,也不行;然後懷疑是LPCTSTR的問題,明天去在試試

 

    int ret ;
    CString strReq;
    

    //發送消息結構
    MsgInfo Msg;                                             

 

    //接收消息結構

    MsgInfo recMsg;                                      

    

    //服務名
    strcpy(Msg.service, "SRVM");  
    
    strReq = strReq + "LOGIN:USER=" + (LPCTSTR)user + ",PSWD=" + (LPCTSTR)password;

    strcpy(Msg.cmd, (LPCTSTR)strReq);                    

 

 

 

【link】http://blog.csdn.net/tingya/archive/2008/03/06/2154430.aspx

 

VC++ 6.0支持Unicode編程,但默認的是ANSI,所以開發人員只需要稍微改變一下編寫代碼的習慣便可以輕鬆編寫支持UNICODE的應用程序。
  使用VC++ 6.0進行Unicode編程主要做以下幾項工作:
1、爲工程添加UNICODE和_UNICODE預處理選項。

  具體步驟:打開[工程]->[設置…]對話框,在C/C++標籤對話框的“預處理程序定義”中去除_MBCS,加上_UNICODE,UNICODE。(注意中間用逗號隔開).

  在沒有定義UNICODE和_UNICODE前,所有函數和類型都默認使用ANSI的版本;在定義了UNICODE和_UNICODE之後,所有的MFC類和Windows API都變成了寬字節版本了。

2、設置程序入口點

  因爲MFC應用程序有針對Unicode專用的程序入口點,我們要設置entry point。否則就會出現連接錯誤。
  設置entry point的方法是:打開[工程]->[設置…]對話框,在Link頁的Output類別的Entry Point裏填上wWinMainCRTStartup。

3、使用ANSI/Unicode通用數據類型

  微軟提供了一些ANSI和Unicode兼容的通用數據類型,我們最常用的數據類型有_T ,TCHAR,LPTSTR,LPCTSTR。
  順便說一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指針,這是爲了兼容Windows 3.1等16位操作系統遺留下來的,在Win32 中以及其它的32位操作系統中,long指針和near指針及far修飾符都是爲了兼容的作用,沒有實際意義。P(pointer)表示這是一個指針;C (const)表示是一個常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示這個變量是一個字符串。綜上可以看出, LPCTSTR表示一個指向常固定地址的可以根據一些宏定義改變語義的字符串。比如:

TCHAR* szText=_T(“Hello!”);TCHAR szText[]=_T(“I Love You”);LPCTSTR lpszText=_T(“大家好!”);使用函數中的參數最好也要有變化,比如:
MessageBox(_T(“你好”));  其實,在上面的語句中,即使您不加_T宏,MessageBox函數也會自動把“你好”字符串進行強制轉換。但我還是推薦您使用_T宏,以表示您有Unicode編碼意識。

4、修改字符串運算問題

  一些字符串操作函數需要獲取字符串的字符數(sizeof(szBuffer)/sizeof(TCHAR)),而另一些函數可能需要獲取字符串的字節數sizeof(szBuffer)。您應該注意該問題並仔細分析字符串操作函數,以確定能夠得到正確的結果。
ANSI操作函數以str開頭,如strcpy(),strcat(),strlen();
Unicode操作函數以wcs開頭,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode操作函數以_tcs開頭 _tcscpy(C運行期庫);
ANSI/Unicode操作函數以lstr開頭 lstrcpy(Windows函數);
考慮ANSI和Unicode的兼容,我們需要使用以_tcs開頭或lstr開頭的通用字符串操作函數。

六、舉個Unicode編程的例子

第一步:
  打開VC++6.0,新建基於對話框的工程Unicode,主對話框IDD_UNICODE_DIALOG中加入一個按鈕控件,雙擊該控件並添加該控件的響應函數:

void CUnicodeDlg::OnButtonUnicode() { TCHAR* str1=_T("ANSI和UNICODE編碼試驗"); m_disp=str1; UpdateData(FALSE);}  添加靜態文本框IDC_DISP,使用ClassWizard給該控件添加CString類型變量m_disp。使用默認ANSI編碼環境編譯該工程,生成Unicode.exe。
第二步:修改系統內碼
  打開“控制面板”,單擊“日期、時間、語言和區域設置”選項,在“日期、時間、語言和區域設置”窗口中繼續單擊“區域和語言選項”選項,彈出“區域和語言選項”對話框。在該對話框中,單擊“高級”標籤,將“非Unicode的程序的語言”選項改爲“日語”,單擊“應用”按鈕,


彈出的對話框單擊“是”,重新啓動計算機使設置生效。
運行Unicode.exe程序並單擊“Button1”按鈕,看,靜態文本框出現了亂碼。

第三步:
  改爲Unicode編碼環境編譯該工程,生成Unicode.exe。再次運行Unicode.exe程序並單擊“Unicode”按鈕。看到Unicode編碼的優勢了吧。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/tingya/archive/2008/03/06/2154430.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章