用一般的数据类型和名字代表字符和字符串
char cResponse; // 'Y' or 'N' char sUsername[64]; 用下面的方式来替代: wchar_t cResponse; // 'Y' or 'N' wchar_t sUsername[64]; 为了支持多语言(Unicode),可以用下面的方式: #include<TCHAR.H> // Implicit or explicit include TCHAR cResponse; // 'Y' or 'N' TCHAR sUsername[64];//字符串
在项目设置中,选择配置选项卡的常规,然后选择字符集。选择使用Unicode字符集。
设置好了以后,当你的项目用该字符集编译时,TCHAR会被翻译成wchar_t.当用ANSI/MBCS编译,则翻译成char。你可以通过项目设置很方便的使用char和wchar_t,不会受到关键字的影响。
#ifdef _UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif
//strlen的原型如下: size_t strlen(const char*); //wcslen的原型如下: size_t wcslen(const wchar_t* ); //使用_tcslen的原型如下: size_t _tcslen(const TCHAR* );
#ifdef _UNICODE #define _tcslen wcslen #else #define _tcslen strlen #endif
如下,你可能会导出如下函数:
void _TPrintChar(char); //客户端怎么按意图调用它呢? void _TPrintChar(wchar_t); //_TPrintChar函数不能将该函数的参数变成2字节字符集,可能使用两个函数: void PrintCharA(char); // A = ANSI void PrintCharW(wchar_t);//W=wide character
#ifdef _UNICODE void _TPrintChar(wchar_t); #else void _TPrintChar(char); #endif //客户端可以简单的调用: TCHAR cChar; _TPrintChar(cChar);
// WinUser.H #ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif //!UNICODE
ANSI字符集,每个字符占一个字节。
Unicode:为了代表Unicode字符串,可以用前缀L,如下:
"This is ANSI String. Each letter takes 1 byte." L"This is Unicode string. Each letter would take 2 bytes, including spaces."在字符串前面的L表示把该字符串转换为Unicode字符串。转换后的字符串的源字符串长度的两倍。
"ANSI String"; // ANSI L"Unicode String"; // Unicode _T("Either string, depending on compilation"); // ANSI or Unicode // or use TEXT macro, if you need more readability
// SIMPLIFIED #ifdef _UNICODE #define _T(c) L##c #define TEXT(c) L##c #else #define _T(c) c #define TEXT(c) c #endif
// SIMPLIFIED #ifdef _UNICODE #define _T(c) L##c #define TEXT(c) L##c #else #define _T(c) c #define TEXT(c) c #endif上面的代码将出现编译错误。_T(c)和_T(str)在ANSI编译模式下可以通过编译。
MFC/ATL CString
通过宏也实现了2个版本
CStringA :ANSI
CStringW:Unicode
LP:代表长指针 C:代表常量 STR:代表字符串
LPSTR
LPCSTR
LPWSTR
LPCWSTR
(C before W,since const
is before WCHAR
)LPTSTR
LPCTSTR
对于ANSI来说:字符数 = 字节数
对于Unicode来说:字符数 = 2 * 字节数
strlen, wcslen or _tcslen 返回的是字符数
sizeof( TCHAR ) 返回的是字节数
pBuffer = (TCHAR*) malloc (128 * sizeof(TCHAR) );