网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

【C++】浅谈一下TCHAR,char和WCHAR(wchar_t)

首先我们先看一下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;
}


  • 标签:
  • TCHAR
  • 宽字符
  • WCHAR
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.