有的人愛用strcpy等標準ANSI函數,有的人愛用_tXXXX函數,有必要把來龍去脈搞清楚。為了搞清這些函數,就必須理請幾種字元類型的寫法。char就不用說了,先說一些wchar_t。wchar_t是Unicode字元的資料類型,它實際定義在<string.h>裡:
typedef unsigned short wchar_t;
不能使用類似strcpy這樣的ANSI C字串函數來處理wchar_t字串,必須使用wcs首碼的函數,例如wcscpy。為了讓編譯器識別Unicode字串,必須以在前面加一個“L”,例如:
wchar_t *szTest=L"This is a Unicode string."
wchar_t是Unicode字元的資料類型,它實際定義在<string.h>裡:
typedef unsigned short wchar_t;
下面在看看TCHAR。如果你希望同時為ANSI和Unicode編譯的原始碼,那就要include TChar.h。TCHAR是定義在其中的一個宏,它視你是否定義了_UNICODE宏而定義成char或者wchar_t。如果你使用了TCHAR,那麼就不應該使用ANSI的strXXX函數或者Unicode的wcsXXX函數了,而必須使用TChar.h中定義的_tcsXXX函數。另外,為瞭解決剛才提到帶“L”的問題,TChar.h中定義了一個宏:“_TEXT”。
以strcpy函數為例子,總結一下:
.如果你想使用ANSI字串,那麼請使用這一套寫法:
char szString[100];
strcpy(szString,"test");
.如果你想使用Unicode字串,那麼請使用這一套:
wchar_t szString[100];
wcscpyszString,L"test");
.如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字串代碼:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
2, ANSI與Unicode
Unicode稱為寬字元型字串,COM裡使用的都是Unicode字串。
將ANSI轉換到Unicode
(1)通過L這個宏來實現,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過MultiByteToWideChar函數實現轉換,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '
(3)通過A2W宏來實現,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
將Unicode轉換到ANSI
(1)使用WideCharToMultiByte,例如:
// 假設已經有了一個Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏來實現,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
有的人愛用strcpy等標準ANSI函數,有的人愛用_tXXXX函數,有必要把來龍去脈搞清楚。為了搞清這些函數,就必須理請幾種字元類型的寫法。char就不用說了,先說一些wchar_t。wchar_t是Unicode字元的資料類型,它實際定義在<string.h>裡:
typedef unsigned short wchar_t;
不能使用類似strcpy這樣的ANSI C字串函數來處理wchar_t字串,必須使用wcs首碼的函數,例如wcscpy。為了讓編譯器識別Unicode字串,必須以在前面加一個“L”,例如:
wchar_t *szTest=L"This is a Unicode string."
wchar_t是Unicode字元的資料類型,它實際定義在<string.h>裡:
typedef unsigned short wchar_t;
下面在看看TCHAR。如果你希望同時為ANSI和Unicode編譯的原始碼,那就要include TChar.h。TCHAR是定義在其中的一個宏,它視你是否定義了_UNICODE宏而定義成char或者wchar_t。如果你使用了TCHAR,那麼就不應該使用ANSI的strXXX函數或者Unicode的wcsXXX函數了,而必須使用TChar.h中定義的_tcsXXX函數。另外,為瞭解決剛才提到帶“L”的問題,TChar.h中定義了一個宏:“_TEXT”。
以strcpy函數為例子,總結一下:
.如果你想使用ANSI字串,那麼請使用這一套寫法:
char szString[100];
strcpy(szString,"test");
.如果你想使用Unicode字串,那麼請使用這一套:
wchar_t szString[100];
wcscpyszString,L"test");
.如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字串代碼:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
2, ANSI與Unicode
Unicode稱為寬字元型字串,COM裡使用的都是Unicode字串。
將ANSI轉換到Unicode
(1)通過L這個宏來實現,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過MultiByteToWideChar函數實現轉換,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '
(3)通過A2W宏來實現,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
將Unicode轉換到ANSI
(1)使用WideCharToMultiByte,例如:
// 假設已經有了一個Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏來實現,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);