首先我们先看一下char与WCHAR的定义:
char:
char是C/C++整型数据中比较古怪的一个,如果不指定signed/unsigned时都默认是signed,但在标准中char是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关的设置来指定它是有符号数还是无符号数。
WCHAR:
查看WCHAR的定义,
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
我们可以看到WCHAR实际上是wchar_t,wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式。
而对于TCHAR来说,其定义跟工程的字符集设置有关,如果你的工程选择使用UNICODE编码,你查看其定义可以看到typedef WCHAR TCHAR;此时TCHAR<==>WCHAR 16bit;如果你的工程选用的是 多字节/未设置 你查看其定义可以看到 typedef char TCHAR;这时TCHAR<==>char 8bit;总而言之TCHAR是跟工程字符集有关的。
下面用代码简单的描述一下:
#ifdef UNICODE //这个宏 与工程字符集有关 typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif typedef unsigned char CHAR; typedef unsigned wchar_t WCHAR;
WCHAR与char的长度不一样,那么就不能直接进行强制的指针转换,这里有几个函数可以简单的将WCHAR与char进行转换:
WCHAR转换到char:(使用函数WideCharToMultiByte(),函数的中文解释参见 http://baike.baidu.com/view/2083430.htm)
WCHAR strOrg[]=L"这是要转换的宽字符串"; char strDesc[100];//转换 后的 目标字符串缓冲区 memset(strDesc,0,sizeof(strDesc));//初始化一下 WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, strOrg,lstrlenW(strOrg), strDesc, sizeof(strDesc), NULL, NULL ); MessageBoxA(strDesc,"Title",MB_OK);
通过上面的转换,我们将WCHAR字符串转换成char字符串,然后通过MessageBoxA()正确显示.
char转换到WCHAR:(使用函数MultiByteToWideChar(),函数的中文解释参见 http://baike.baidu.com/view/1907282.htm)
char strOrg[] = "这时要转换的8bit普通字符串"; WCHAR strDesc[100];//转换后的缓冲区 memset(strDesc,0,sizeof(strDesc));//初始化一下 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, strOrg,strlen(strOrg), strDesc,sizeof(strDesc)/2); MessageBoxW(m_hWnd,strDesc,L"Title",MB_OK);
通过上面的转换,我们将char字符串转换成了WCHAR字符串,然后通过MessageBoxW()正确的显示.
PS:
在上面的代码中 L""是告诉编译器按照 宽字符保存这个字符串.
一般的宽字符与char的操作函数对照
格式化:
wprintf<--->printf
wsprintf<--->sprintf
wvsprintf<--->vsprintf
长度计算:
LPCTSTR strTmp : lstrlen( LPCTSTR lpString );
char *strTmp : strlen( const char *string );
本文出自 悠然品鉴,转载请注明出处:http://www.youranshare.com/blog/sid/23.html
int main() { int a = 0; return 0; }