【49】MFC入门到精通——MFC string转CString、 CString转string 【Unicode、多字节编码下】、【CT2A /CW2A、CA2T/CA2W】

1 string --> CString

在使用MFC时,遇到了CString与string转换的问题,特此记录下来。其实CString与string的转换方式有挺多种的,但也并不是每一种都适用,可能需要一些稍微的改动才能正常运行。

	std::string str3 = "你好呀! hello 123 ";

	CString CStr = str3.c_str();

比如网上常见的一种转换方法(如果你的能直接转换也是没问题滴):

在这里插入图片描述

发现转不了,就很气。提示错误翻译一下大概就是说:没有合适的构造函数来进行那个类型的转换。

提示错误为:

no suitable constructor exists to convert from “const char *” to “ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, 
ATL::ChTraitsCRT<wchar_t>>>,
严重性	代码	说明	项目	文件	行	禁止显示状态
错误	C2440	“初始化”: 无法从“const _Elem *”转换为“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”	
MFCApplication1	D:\Projects\MFC\MFCApplication1\MFCApplication1\MFCApplication1Dlg.cpp	610	
严重性	代码	说明	项目	文件	行	禁止显示状态
错误(活动)	E0415	不存在从 "const char *" 转换到 "ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, ATL::ChTraitsCRT<wchar_t>>>" 
的适当构造函数	MFCApplication1	D:\Projects\MFC\MFCApplication1\MFCApplication1\MFCApplication1Dlg.cpp	610	

为什么呢?原因就是CString c_name = name.c_str();其实是需要调用拷贝构造函数的,但是类型不匹配,所以找不到合适的构造函数。

1.1 Unicode编码下

1.1.1 方法1:ATL字符串转换宏

该方法是比较通用的,通过使用ATL字符串转换宏。

	std::string str1 = "hello !";
	std::string str2 = "你好!";
	std::string str3 = "你好呀! hello 123 ";

	CString CStr,cstr1, cstr2, cstr3;


	cstr1 = CA2T(str1.c_str()); //所以CA2T也就是CA2W就是将多字符集转换为宽字符UNICODE,也可写成CA2W。
	cstr2 = CA2T(str2.c_str()); 
	cstr3 = CA2W(str3.c_str());//写成CA2W,试试看

	CStr = cstr1 + "\r\n" + cstr2 + "\r\n" + cstr3;

	AfxMessageBox(CStr);

在这里插入图片描述

cstr1 = CA2T(str1.c_str()); //所以CA2T也就是CA2W就是将多字符集转换为宽字符UNICODE,也可写成CA2W

1.1.2 方法2:调用“赋值运算符重载” (区别于直接赋值)

修改编码可能导致程序中其它地方出现错误(我的就是- -!)。所以可以调用“赋值运算符重载”的方式来完成转换,很简单也很实用。不用修改编码方式。

	std::string str3 = "你好呀! hello 123 ";

	CString CStr;

	CStr = str3.c_str();//注意这里使用的是 =运算符的重载,注意与直接赋值的区别

	AfxMessageBox(CStr);

在这里插入图片描述

注意二者区别,定义时,直接赋值,是不行的。

在这里插入图片描述

混合字符串

	std::string str1 = "hello !";
	std::string str2 = "你好!";
	std::string str3 = "你好呀! hello 123 ";

	CString CStr,cstr1, cstr2, cstr3;

	cstr1 = str1.c_str(); 
	cstr2 = str2.c_str(); 
	cstr3 = str3.c_str();

	CStr = cstr1 + "\r\n" + cstr2 + "\r\n" + cstr3;

	AfxMessageBox(CStr);

在这里插入图片描述

这种方式在 Unicode编码、多字节编码 下通用

1.1.3 自己封装函数 Str2Cstr(string str)

也可以直接写个函数用:

CString Str2Cstr(string str)
{
   
   
	return CString
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值