MFC字符串类型和相互转换
来源:互联网 发布:淘宝网雪地靴 编辑:程序博客网 时间:2024/05/16 14:49
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头文件下看看这些宏的定义,
#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,即多字节转换为宽字节
_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 *
1 void *_alloca( 2 size_t size 3 );
使用方法举例:
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
将字符转换封装到函数里面1 void DoA2W()2 {3 USES_CONVERSION;4 DoSomething(A2W("SomeString"));5 }
除此之外,还可以使用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;
- MFC字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- MFC下的各种字符串类型和相互转换
- 字符类型和字符串类型相互转换
- 日期类型和字符串类型相互转换
- 日期类型和字符串相互转换
- MFC中CString与Char类型字符串的相互转换
- 数字类型和字符串类型的相互转换
- python 数字类型和字符串类型的相互转换
- C++/MFC-CHAR和WCHAR类型的相互转换
- 完成一程序演示字符数组、C风格字符串、std::string和MFC中的Cstring类型之间的相互转换
- java 字符串和日期类型的相互转换问题
- 在枚举类型的值和字符串之间相互转换
- C风格字符串和string类型的相互转换
- 字符串字符数组和基本类型的相互转换
- 在枚举类型的值和字符串之间相互转换
- poj3071
- Javadoc标签介绍
- 有了自己的博客
- 【MATLAB图像处理3】 canny边缘检测 (附源码)
- poj 1808 Quadratic Residues
- MFC字符串类型和相互转换
- cxf wss4j 令牌验证 为什么 回调是空?
- 常见的20种VC++编译错误信息
- 金山的一道有关线程的笔试题
- 2.字符串的反转,比如abcde,输出edcba
- iOS 6 By Tutorials源码地址
- COJ 1065括号匹配:栈的简单应用
- window.location.Reload()和window.location.href 区别
- java 获得的系统时间与操作系统的时间不一致