看流星社区

 找回密码
 注册账号
查看: 2352|回复: 0

MFC下的各种字符串类型和相互转换

[复制链接]

该用户从未签到

发表于 2015-6-8 09:00:02 | 显示全部楼层 |阅读模式
MFC下的常用字符串数据类型表示的含义:

L:Long  长  P:Point  指针  C:Const  常量  W:Wchar_t  宽字符  T:TCHAR   STR:String  字符串

在看看MFC下各种数据类型的定义:

typedef char *LPSTR;  
    typedef const char *LPCSTR;  
  
    typedef wchar_t *LPWSTR;   
    typedef const wchar_t *LPCWSTR;   
    typedef wchar_t WCHAR;  
  
#ifdef  UNICODE   
    typedef LPCWSTR  LPCTSTR;  
    typedef WCHAR TCHAR;  
  
#else  
    typedef LPCSTR LPCTSTR;  
    typedef char TCHAR;  

MFC下提供的ATL 转换宏:

T2A  T2W  T2CA T2CW         W2A  W2CA W2T  W2CT         A2W  A2CW A2T  A2CT

T:TCHAR  2:To  C:CONST  A:CHAR(ANSI)  W:WCHAR

先到atlconv.h头文件下看看这些宏的定义,

[cpp] view plaincopyprint?
#ifndef _DEBUG  
#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)  
#else  
#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)  
#endif  

可见,USES_CONVERSION宏定义了一些转换所需要的变量,如_convert。所以使用那些宏的时候必须加上该宏。

2.A2W:这里就用到了USES_CONVERSION宏定义的_convert变量
#define A2W(lpa) (\  
  ((_lpa = lpa) == NULL) ? NULL : (\  
  _convert = (lstrlenA(_lpa)+1),\  
  (INT_MAX/2<_convert)? NULL :  \  
  ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))  

3.ATLA2WHELPER
1  #define ATLA2WHELPER AtlA2WHelper  

4.AtlA2WHelper:实际上还是在调用MultiByteToWideChar,即多字节转换为宽字节
[cpp] view plaincopyprint?
_Ret_opt_z_cap_(nChars) inline LPWSTR WINAPI AtlA2WHelper(_Out_z_cap_(nChars) LPWSTR lpw, _In_z_ LPCSTR lpa, _In_ int nChars, _In_ UINT acp) throw()  
{  
  ATLASSERT(lpa != NULL);  
  ATLASSERT(lpw != NULL);  
  if (lpw == NULL || lpa == NULL)  
   return NULL;  
  *lpw = '\0';  
  int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);  
  if(ret == 0)  
  {  
   ATLASSERT(FALSE);  
   return NULL;  
  }   
  return lpw;  
}  

5.alloca

#define alloca  _alloca

6._alloca:该函数从堆上分配以字节为单位的内存,返回void *
void *_alloca(
   size_t size
   );

使用方法举例:

USES_CONVERSION;  //USES_CONVERSION是ATL中的一个宏定义,用于编码转换,它定义了转换宏所需的一些局部变量  
  
WCHAR *pWch = L"WCHAR* TO CHAR*";  
CHAR *pCh = W2A(pWch);  
   
TCHAR *pTch = _T("TCHAR* TO CHAR*");  
CHAR *pCh2 = T2A(pTch);  

使用USES_CONVERSION一定要小心,它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。如果在一个循环中,这个宏被反复调用几万次,将不可避免的产生stackoverflow。

但是考虑到栈空间的尺寸( 默认2M),使用时要注意几点:
    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

  参见http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html

将字符转换封装到函数里面

void DoA2W()
{
     USES_CONVERSION;
     DoSomething(A2W("SomeString"));
}

除此之外,还可以使用C语言<stdlib.h>提供的函数:

char * pstr = "abc";  

    size_t nLen = _mbstrlen(pstr) + 1;  
    //也可以用mbstowcs(NULL, pstr, 0);,第一个和第三个参数为空即得到非空字符的长度  
      
    wchar_t * pwstr = new wchar_t[nLen];  
    mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string  
  
    size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)  
    char *pstr2 = new char[nwLen];  
    wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string  
  
    delete []pwstr;  
    pwstr = NULL;  
  
    delete []pstr2;  
    pstr2 = NULL;
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-27 04:34

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表