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/

[转]VC中char,TCHAR,WCHAR总结相关推荐

  1. VC中char,TCHAR,WCHAR总结

    char,TCHAR,WCHAR区别 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif t ...

  2. VC 中char 与 wchar的转换

    char 转 WCHAR WCHAR * charToWchar(char *s){ int w_nlen=MultiByteToWideChar(CP_ACP,0,s,-1,NULL,0); WCH ...

  3. char,TCHAR,WCHAR区别

    #ifdef   UNICODE                typedef   wchar_t   TCHAR; #else                typedef   unsigned   ...

  4. VC++中的char,wchar_t,TCHAR(转载)

    VC++中的char,wchar_t,TCHAR 大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱.为了统一,有必要把来龙去脉搞 ...

  5. VC++ WCHAR,CHAR,TCHAR的区别

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

  6. WCHAR,CHAR,TCHAR的区别

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

  7. VC++中CString和char*的相互转换

    网上转来的 学习下 1.传给未分配内存的const char* (LPCTSTR)指针.    CString cstr(asdd);    const char* ch = (LPCTSTR)cst ...

  8. VC中的一些字符类型及其转换

    一.VC中字符串类型的互相转换       总是觉得VC中的类型纷繁复杂,扑朔迷离.因为有了Unicode,因为C.C++类型相互转化如此不同.保存char的不止char一种,还可以用short,un ...

  9. VC中_T()与L区别(转)

    VC中_T("")与L区别 区别解释 一说这个话题,肯定涉及MS的字符集,先看MS对_T(其中_TEXT(")与_T("")一样)的定义: [cpp] ...

最新文章

  1. 跨域 (1) jsonp 跨域
  2. linux mount挂载命令(将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来)
  3. 字符串原样输出程序python_Python格式化字符串(格式化输出)
  4. OpenCV2:幼儿园篇 第一章 创建图像并显示
  5. 理解关于java反射中类的域及修饰符
  6. 用户特征工程详细解读
  7. 互联网晚报 | 9月11日 星期六 | 魅蓝宣布正式回归;黑石集团终止收购SOHO中国;“小酒馆第一股”海伦司正式登陆港交所...
  8. Spring MVC中的基本流程
  9. 快狗打车通过港交所上市聆讯
  10. R+工业级GBDT︱微软开源 的LightGBM(R包已经开放)
  11. 说说年度补税退税的问题
  12. 面经 - 计算机网络知识点
  13. 自建DDNS配置教程(dynu)
  14. SVG—最简单的SVG动画
  15. 快恢复二极管工作原理、反向恢复时间详解
  16. ECMAScript - GrammarⅠ
  17. form表单提交时传递额外的参数
  18. cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…
  19. 首次使用计算机按什么键,电脑怎么重启按什么键
  20. Openstack之Keystone组件解析

热门文章

  1. python分布式邻居节点通讯_P2P网络及节点发现机制
  2. linux监控cpu进程,Linux性能监控之CPU篇详解
  3. 2005年,鼹鼠来了!!!
  4. 新概念英语第二册01-30课(转)
  5. unity,第三人称射击游戏的摄像机实现
  6. 谷歌“败走麦城”,宣布解散健康部门Google Health
  7. java-net-php-python-jsp员工考勤录像计算机毕业设计程序
  8. 苏格拉底 《斐多篇》
  9. MCU芯片如何正确选型
  10. 使用pyinstaller将python项目打包发布为exe可执行文件