char,TCHAR,WCHAR区别

转载 2011年01月23日 14:01:00

[转]VC中char,TCHAR,WCHAR总结

char,TCHAR,WCHAR区别

#ifdef   UNICODE     
typedef   wchar_t   TCHAR;    

#else     
typedef   unsigned   char   TCHAR;    

#endif     
typedef   unsigned   char   CHAR;     
typedef   unsigned   wchar_t   WCHAR;   

由此可以看出,CHAR实施上就是unsigned char,WCHAR为宽字符,而TCHAR根据是否支持unicode而不同。

在程序使用sizeof(TCAHR),当默认设置时,这个值是1;当定义UNICODE宏时,这个值是2。

 

MultiByteToWideChar和WideCharToMultiByte用法详解

//========================================================================

//TITLE:

//    MultiByteToWideChar和WideCharToMultiByte用法详解

//AUTHOR:

//    norains

//DATE:

//    第一版:Monday  25-December -2006

//    增补版:Wednesday 27-December -2006

//    修订版:Wednesday 14-March-2007 (修正之前的错误例子)

//Environment:

//  EVC4.0 + Standard SDK

//========================================================================

 

1.使用方法详解

  在本文开始之处,先简要地说一下何为短字符和宽字符.

  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于 windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.

 

  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.

  好吧,那就让我们开始吧.

 

  这个是我们需要转化的多字节字符串:  

  char sText[20] = {"多字节字符串!OK!"};

 

  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假 如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一 个好主意.

  所幸,我们能够确知所需要的数组空间.

  我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:

  DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);

 

  接下来,我们只需要分配响应的数组空间:

  wchar_t *pwText;

  pwText = new wchar_t[dwNum];

  if(!pwText)

  {

   delete []pwText;

  }

 

  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:

  MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);

 

  最后,使用完毕当然要记得释放占用的内存:

  delete []psText;

 

 

  同理,宽字符转为多字节字符的代码如下:  

  wchar_t wText[20] = {L"宽字符转换实例!OK!"};

  DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);

  char *psText;

  psText = new char[dwNum];

  if(!psText)

  {

   delete []psText;

  }

  WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);

  delete []psText;

 

   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?

   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:

     

  //-------------------------------------------------------------------------------------

  //Description:

  // This function maps a character string to a wide-character (Unicode) string

  //

  //Parameters:

  // lpcszStr: [in] Pointer to the character string to be converted

  // lpwszStr: [out] Pointer to a buffer that receives the translated string.

  // dwSize: [in] Size of the buffer

  //

  //Return Values:

  // TRUE: Succeed

  // FALSE: Failed

  //

  //Example:

  // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));

  //---------------------------------------------------------------------------------------

  BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)

  {

    // Get the required size of the buffer that receives the Unicode

    // string.

    DWORD dwMinSize;

    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);

 

    if(dwSize < dwMinSize)

    {

     return FALSE;

    }

 

    

    // Convert headers from ASCII to Unicode.

    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  

    return TRUE;

  }

 

  //-------------------------------------------------------------------------------------

  //Description:

  // This function maps a wide-character string to a new character string

  //

  //Parameters:

  // lpcwszStr: [in] Pointer to the character string to be converted

  // lpszStr: [out] Pointer to a buffer that receives the translated string.

  // dwSize: [in] Size of the buffer

  //

  //Return Values:

  // TRUE: Succeed

  // FALSE: Failed

  //

  //Example:

  // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));

  //---------------------------------------------------------------------------------------

  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)

  {

   DWORD dwMinSize;

   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);

   if(dwSize < dwMinSize)

   {

    return FALSE;

   }

   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);

   return TRUE;

  }

 

 

  使用方法也很简单,示例如下:

  wchar_t wText[10] = {L"函数示例"};

  char sText[20]= {0};

  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));

  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));

 

  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

 

2.MultiByteToWideChar()函数乱码的问题

  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.

  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以 肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".

  系统定制时选择默认语言的位置于:

  Platform -> Setting... -> locale -> default language ,选择"中文",然后编译即可.

 

String,CString,TCHAR,char之间区别和联系

2008-07-25 19:53

 

 

char是类型

TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是

char还是w_char;

TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符

#ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif

所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t.

至于String,CString他们都是一种封装了字串处理的操作!

你可以打开他们的源代码找寻究竟!

CString属于VC的类库

string是标准C++的类库

string.h是C的库函数。

研究它们的源代好些!

TCHAR,char是可以同整型互换的类型。

String,CString代表了一块内存区域。

TCHAR 赋值

#include <tchar.h>

TCHAR szWindowText[256]=_T("QQ2006");

char*、TCHAR*转换CString

CString str(****)

下面详细写一下其它转换

//////////////////////////////

/*

***********************************************************************

* 函数: TransCStringToTCHAR

* 描述:将CString 转换为 TCHAR*

* 日期:

***********************************************************************

*/

TCHAR* CPublic::CString2TCHAR(CString &str)

{

int iLen = str.GetLength();

TCHAR* szRs = new TCHAR[iLen];

lstrcpy(szRs, str.GetBuffer(iLen));

str.ReleaseBuffer();

return szRs;

}

/*

***********************************************************************

* 函数: THCAR2Char

* 描述:将TCHAR* 转换为 char*

* 日期:

***********************************************************************

*/

char* CPublic::THCAR2char(TCHAR* tchStr)

{

int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度

char* chRtn = new char[iLen+1]

wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值

return chRtn;

}

/*

***********************************************************************

* 函数: CString2char

* 描述:将CString转换为 char*

* 日期:

***********************************************************************

*/

char* CPublic::CString2char(CString &str)

{

int len = str.GetLength();

char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度

memset(chRtn, 0, 2*len+1);

USES_CONVERSION;

strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));

return chRtn;

}

//参考

///////////////////////

//Pocket PC上的UNICODE和ANSI字符串

//By Vassili Philippov, September 26, 2001.

//杨方思歧 译

////////////////////////

/*

***********************************************************************

* 函 数 名:GetAnsiString

* 描 述:将CString(unicode)转换为char*(ANSI)

* 参 数:CString &s 要转换的CString

* 返 回 值:返回转换结果

* 创建日期:

* 最后修改:

***********************************************************************

*/

char* GetAnsiString(const CString &s)

{

int nSize = 2*s.GetLength();

char *pAnsiString = new char[nSize+1];

wcstombs(pAnsiString, s, nSize+1);

return pAnsiString;

}

 

文章原始出处:http://chunniux.blog.163.com/blog/static/14849719201041295542649/

相关文章推荐

String,CString,TCHAR,char之间区别和联系

char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char;TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同...
  • lsldd
  • lsldd
  • 2009-08-05 15:53
  • 6237

C++ 调用DLL方法 及 DLL与lib的区别

C++ 调用DLL方法①LIB文件直接加入到工程文件列表中  在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框...
  • badwps
  • badwps
  • 2010-05-12 13:19
  • 2730

VC++ WCHAR,CHAR,TCHAR的区别

C++的字符分成两种类型wchar_t和char。   其中   WCHAR==wchar_t,CHAR==char。   TCHAR是一种条件编译的类型,根据条件可以代表wchar_t或char。 ...

C++字符类型TCHAR、char和wchar_t

1、首先,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,char型无法表示。 2、wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式,wc...

TCHAR和CHAR类型的互转

Win32中CStdString 是需要TCHAR类型的值才可以赋值的,而很多文件读取时FILE的fopen函数之类的需要的是CHAR,我们需要把它们互转,这里我在网上找到了一个比较方便的方法   ...
  • Qsir
  • Qsir
  • 2017-08-10 16:39
  • 159

【C++】用结构体完成:编程求出3个学生中某个学生的平均成绩

//用结构体完成:编程求出3个学生中某个学生的平均成绩 #include #include using namespace std; struct student { char *name; ...

char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集

字符类型、字符指针类型、字符串字面值 字符类型:     char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTE     char    &#...

C++中char*与wchar_t*之间的转换

代码编译运行环境:VC++2012+Debug+Win321.问题描述char字符与wchar_t字符由于编码不同,所以在char*和wchar_t*之间使用强制类型转换达不到正确转换字符串的目的。考...

char TCHAR WCHAR区别

  • 2013-05-14 19:02
  • 228KB
  • 下载

windows编程中的char, TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR区别

TCHAR可以根据定义编译变量不同解释为char, wchar_t。用时需要加入对头文件 tchar.h 的文件 LPXXX其实是指向相应类型的字符串的指针(LP -- long pointer) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)