zoukankan      html  css  js  c++  java
  • MFC下的各种字符串类型和相互转换

    MFC下的常用字符串数据类型表示的含义:

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

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

    复制代码
     1     typedef char *LPSTR;
     2     typedef const char *LPCSTR;
     3 
     4     typedef wchar_t *LPWSTR; 
     5     typedef const wchar_t *LPCWSTR; 
     6     typedef wchar_t WCHAR;
     7 
     8 #ifdef  UNICODE 
     9     typedef LPCWSTR  LPCTSTR;
    10     typedef WCHAR TCHAR;
    11 
    12 #else
    13     typedef LPCSTR LPCTSTR;
    14     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头文件下看看这些宏的定义,

    1.USES_CONVERSION:注意int _convert; (_convert);这种用法是为了屏蔽编译器的警告:未引用的局部变量。。。

    #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变量

    1 #define A2W(lpa) (
    2  ((_lpa = lpa) == NULL) ? NULL : (
    3  _convert = (lstrlenA(_lpa)+1),
    4  (INT_MAX/2<_convert)? NULL :  
    5  ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))

    3.ATLA2WHELPER

    1  #define ATLA2WHELPER AtlA2WHelper

    4.AtlA2WHelper:实际上还是在调用MultiByteToWideChar,即多字节转换为宽字节

    复制代码
     1  _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()
     2  {
     3   ATLASSERT(lpa != NULL);
     4   ATLASSERT(lpw != NULL);
     5   if (lpw == NULL || lpa == NULL)
     6    return NULL;
     7   *lpw = '';
     8   int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
     9   if(ret == 0)
    10   {
    11    ATLASSERT(FALSE);
    12    return NULL;
    13   }  
    14   return lpw;
    15  }
    复制代码

    5.alloca

    #define alloca  _alloca

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

    1 void *_alloca( 
    2   size_t size 
    3   );



    使用方法举例:

    复制代码
    1  USES_CONVERSION;//USES_CONVERSION是ATL中的一个宏定义,用于编码转换,它定义了转换宏所需的一些局部变量
    2 
    3  WCHAR *pWch = L"WCHAR* TO CHAR*";
    4  CHAR *pCh = W2A(pWch);
    5  
    6  TCHAR *pTch = _T("TCHAR* TO CHAR*");
    7  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

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

    1 void DoA2W()
    2 {
    3     USES_CONVERSION;
    4     DoSomething(A2W("SomeString"));
    5 }

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

    复制代码
     1     char * pstr = "abc";
     2 
     3     size_t nLen = _mbstrlen(pstr) + 1;
     4     //也可以用mbstowcs(NULL, pstr, 0);,第一个和第三个参数为空即得到非空字符的长度
     5     
     6     wchar_t * pwstr = new wchar_t[nLen];
     7     mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string
     8 
     9     size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)
    10     char *pstr2 = new char[nwLen];
    11     wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string
    12 
    13     delete []pwstr;
    14     pwstr = NULL;
    15 
    16     delete []pstr2;
    17     pstr2 = NULL;
    复制代码
  • 相关阅读:
    day79——基础知识复习3(django)
    day78——基础知识复习2
    bjday5——组件的嵌套与传值
    drfday2——序列化组件serializer
    drfday5——权限,频率,异常处理
    drfday1——入门规范
    ElasticSearch基本查询使用(2)
    RocketMQ(2) 消息的生产和存储
    ElasticSearch基础介绍(1)
    RocketMQ(3) 根据消息key查询功能的实现: indexFile
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/4029783.html
Copyright © 2011-2022 走看看