1.ANSIC與Unicode字元
兩者區別就不多少了,一個單位元組一個雙位元組,Unicode可以表示更多的字元,適合諸如漢字的文字系統.
定義使用寬字元:
2.聲明Unicode字元與及字串方法:
_T()宏需要包含tchar.h
1 wchar_t c=L'A';
2 wchar_t szBuffer[10]=L"A String";
3
WinNt.h定義了一下宏:
1 #ifdef UNICODE
2 typedef WCHAR TCHAR ,*PTCHAR,PTSTR;
3 typedef CONST WCHAR *PCTSTR;
4 #define __TEXT(quote) quote
5 #define __TEXT(quote) L##quote
6
7 #else
8 typedef CHAR TCHAR ,*PTCHAR,PTSTR;
9 typedef CONST CHAR *PCTSTR;
10 #define __TEXT(quote) quote
11
12 #endif
13 #define __TEXT(quote) quote TEXT(quote)
14
15
可以利用以上宏來定義:在Visual Studio建立工程,一般都開啟了Unicode選項,直接就可以定義寬字元。
1 TCHAR C=TXET('a');//如果定義了Unicode 則是16位字元,否則是8位
2 TCHAR C=L'a';
3 TCHAR szBuffer[10]=TEXT("a String");
4 TCHAR szBuffer[10]=_T("a String");
5
3.Ansic與Unicode的轉換:
1 //定義ANSIC字串
2 char *c ="Test!";
3 std::cout<<c<<std::endl;
4 //ANSIC轉到寬字元
5 int Length = MultiByteToWideChar(CP_ACP,0,c,-1,NULL,0);
6 wchar_t *pWideCharStr = new wchar_t[sizeof(wchar_t)*Length];
7 MultiByteToWideChar(CP_ACP,0,c,6,pWideCharStr,Length*sizeof(wchar_t));
8 std::wcout<<"MultiByteToWideChar:"<<pWideCharStr<<std::endl;
9 //寬字元轉換到ANSIC
10 Length = WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,NULL,0,NULL,NULL);
11 char *pMultiByte = new char[Length*sizeof(char)] ;
12 WideCharToMultiByte(CP_ACP,0,pWideCharStr,-1,pMultiByte,Length*sizeof(char),NULL,NULL);
13 std::cout<<"WideCharToMultiByte:"<<pMultiByte;
14
15 delete [] pWideCharStr;
16 delete [] pMultiByte;
4.推薦的字串使用方式
1).開始將文本字串想像為字元的數組,而不是char或位元組的數組
2).用通用的資料類型如用TCHAR PTSTR表示字元和字串
3).統一用TEXT _T宏來表示字面量的字元和字串,不要混用
4).用BYTE和 PBYTE來表示位元組、位元組指標和資料緩衝區
5).避免使用printf系列函數,尤其不要使用%s來進行Ansic跟Unicode的互相轉換
應該使用MultiByteToWideChar和WideCharToMutiByte,具體用法參看MSDN
6).推薦從現在開始就使用Unicode字元,理由很簡單,為了程式碼的重用性:Com編程模型只支援Unicode
微軟.net技術,還有新的API函數都不支援ANSIC
轉載自http://dev.21tx.com/2010/08/04/13200.html