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://windows.chinaitlab.com/skill/872188_2.html

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

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

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

  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. twitter storm学习 - 安装部署问题汇总
  2. 剑指offer23 从上往下打印二叉树
  3. DR模式下的mysql (abb读写分离)
  4. python课本第二章答案_《Python自然语言处理》答案第一、二章
  5. 常用排序算法(二)快速排序
  6. Tableau:仪表板操作
  7. Torch常用函数详解
  8. 距离最短原则的离散点连接 Python实现
  9. 安卓手机分辨率修改工具的使用方法
  10. 人体神经系统示意图手绘,人体神经结构图示意图
  11. 2008最佳显微照片公布
  12. 深圳Java学习:面向对象【重点知识】
  13. mkv文件怎么转换成mp4?来看看这四种转换方式吧!
  14. 【学习笔记】Java虚拟机(二)内存区域与内存溢出
  15. Android学习相关文章汇总(持续更新,文章均来自网络,转侵删)
  16. 用python控制硬件_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统...
  17. 数据库在当前时间加上指定的时分秒(mysql,DM)日期
  18. 必备干货外贸技巧,你拥有了吗?
  19. go五笔——基于Google在线五笔制作
  20. 三相桥式PWM整流电路 整流电路采用全控型三相桥式整流

热门文章

  1. 20 世纪 70 年代的太空殖民艺术
  2. Ansible 获取主机信息模块setup、获取文件详细信息模块stat(学习笔记十)
  3. Heartbeat(v1、v2、pacemaker)集群组件概述
  4. Python一课一练(网站项目做单元测试)
  5. Eclipse快捷键 10个最有用的快捷键(转)
  6. SCCM 2012 R2 从入门到精通 Part11 系统推送(2)
  7. error LNK2005: void * __cdecl operator new(unsigned int) (??2@YAPAXI@Z) already defined in LIBCMT.
  8. webpack4与babel配合使es6代码可运行于低版本浏览器
  9. Buffer.from(str[, encoding])
  10. Ural 1297 Palindrome(后缀数组+最长回文子串)