如果直接用vs2015打开2015以下版本的多字节字符集项目,是可以编译通过的。但是如果用VS2015新建项目设置成多字节字符集就不行了。
大家碰到过这个问题吗?还是我这里问题?
16 个解决方案
#1
[莫非是utf8惹的祸?, vs2015 在项目中设置多字节字符集没有效果,设置了还是在使用Unicode。就算不加其他任何类,新建一个项目,设置成多字节字符集,还是默认使用Unicode编译的。
像这样随便写两句代码:
CString str = "11";
SetWindowText("11");
就会提示报错
error C2440: “初始化”: 无法从“const char [3]”转换为“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”
note: class“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”的构造函数声明为“explicit”
error C2664: “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“const char [3]”转换为“LPCTSTR”, 没人知道怎么解决么,我也遇到这个问题了 , CString str = _T("11");, 要装MBCS补丁,到ms官网上去找, 我这没事vs2015 update3
而且unicode这个好用干嘛不用?, C++新标准 默认的char就是utf8字符 个人觉得挺好
最好新工程别再选unicode了 到时候转换的时候 到底是mbcs转utf16还是utf8转16呢?容易造成混乱 , CString str = "11";
SetWindowText("11");
改成
CString str = _T("11");
SetWindowText(_T("11"));, Cstring 与string 有啥区别, “”要装MBCS补丁,到ms官网上去找“”
好像是这样, MFC SetWindowText 是对 Windows API 的封装,编码只有一种,当然会有问题了。
而 CString 的运算符重载,一般都会有两个:针对 MBCS 和 Unicode 的不同版本。
一般来说,CString 不管是项目设置为何种编码,都是正确的:
CString str1 = "11";
CString str2 = L"11";
CString str3 = _T("11"); // 或 TEXT("11")
而 SetWindowText 则不同,ANSI/MBCS 就必须是:
SetWindowText("11");
Unicode 就必须是:
SetWindowText(L"11");
当然,你可以用任意一个 CString 来设置:
SetWindowText((LPCTSTR)str1);
SetWindowText((LPCTSTR)str2);
SetWindowText((LPCTSTR)str3);
那时因为 CString 的运算符重载会将任何编码转换为项目所设置编码,即与 SetWindowText 相符。, 检查下你的工程属性或代码中有没有其它地方设置UNICODE或_UNICODE这两个宏。, 我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把exe改成dll, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装. ,
据说要打多字节字符集补丁。, 你需要下载多字节的补丁,默认好像是不支持多字节的, 我的VS2015 Update1正常,也没打MBCS补丁。]
像这样随便写两句代码:
CString str = "11";
SetWindowText("11");
就会提示报错
error C2440: “初始化”: 无法从“const char [3]”转换为“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”
note: class“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”的构造函数声明为“explicit”
error C2664: “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“const char [3]”转换为“LPCTSTR”, 没人知道怎么解决么,我也遇到这个问题了 , CString str = _T("11");, 要装MBCS补丁,到ms官网上去找, 我这没事vs2015 update3
而且unicode这个好用干嘛不用?, C++新标准 默认的char就是utf8字符 个人觉得挺好
最好新工程别再选unicode了 到时候转换的时候 到底是mbcs转utf16还是utf8转16呢?容易造成混乱 , CString str = "11";
SetWindowText("11");
改成
CString str = _T("11");
SetWindowText(_T("11"));, Cstring 与string 有啥区别, “”要装MBCS补丁,到ms官网上去找“”
好像是这样, MFC SetWindowText 是对 Windows API 的封装,编码只有一种,当然会有问题了。
而 CString 的运算符重载,一般都会有两个:针对 MBCS 和 Unicode 的不同版本。
一般来说,CString 不管是项目设置为何种编码,都是正确的:
CString str1 = "11";
CString str2 = L"11";
CString str3 = _T("11"); // 或 TEXT("11")
而 SetWindowText 则不同,ANSI/MBCS 就必须是:
SetWindowText("11");
Unicode 就必须是:
SetWindowText(L"11");
当然,你可以用任意一个 CString 来设置:
SetWindowText((LPCTSTR)str1);
SetWindowText((LPCTSTR)str2);
SetWindowText((LPCTSTR)str3);
那时因为 CString 的运算符重载会将任何编码转换为项目所设置编码,即与 SetWindowText 相符。, 检查下你的工程属性或代码中有没有其它地方设置UNICODE或_UNICODE这两个宏。, 我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把exe改成dll, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装. ,
据说要打多字节字符集补丁。, 你需要下载多字节的补丁,默认好像是不支持多字节的, 我的VS2015 Update1正常,也没打MBCS补丁。]
#1
[莫非是utf8惹的祸?, vs2015 在项目中设置多字节字符集没有效果,设置了还是在使用Unicode。就算不加其他任何类,新建一个项目,设置成多字节字符集,还是默认使用Unicode编译的。
像这样随便写两句代码:
CString str = "11";
SetWindowText("11");
就会提示报错
error C2440: “初始化”: 无法从“const char [3]”转换为“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”
note: class“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”的构造函数声明为“explicit”
error C2664: “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“const char [3]”转换为“LPCTSTR”, 没人知道怎么解决么,我也遇到这个问题了 , CString str = _T("11");, 要装MBCS补丁,到ms官网上去找, 我这没事vs2015 update3
而且unicode这个好用干嘛不用?, C++新标准 默认的char就是utf8字符 个人觉得挺好
最好新工程别再选unicode了 到时候转换的时候 到底是mbcs转utf16还是utf8转16呢?容易造成混乱 , CString str = "11";
SetWindowText("11");
改成
CString str = _T("11");
SetWindowText(_T("11"));, Cstring 与string 有啥区别, “”要装MBCS补丁,到ms官网上去找“”
好像是这样, MFC SetWindowText 是对 Windows API 的封装,编码只有一种,当然会有问题了。
而 CString 的运算符重载,一般都会有两个:针对 MBCS 和 Unicode 的不同版本。
一般来说,CString 不管是项目设置为何种编码,都是正确的:
CString str1 = "11";
CString str2 = L"11";
CString str3 = _T("11"); // 或 TEXT("11")
而 SetWindowText 则不同,ANSI/MBCS 就必须是:
SetWindowText("11");
Unicode 就必须是:
SetWindowText(L"11");
当然,你可以用任意一个 CString 来设置:
SetWindowText((LPCTSTR)str1);
SetWindowText((LPCTSTR)str2);
SetWindowText((LPCTSTR)str3);
那时因为 CString 的运算符重载会将任何编码转换为项目所设置编码,即与 SetWindowText 相符。, 检查下你的工程属性或代码中有没有其它地方设置UNICODE或_UNICODE这两个宏。, 我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把exe改成dll, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装. ,
据说要打多字节字符集补丁。, 你需要下载多字节的补丁,默认好像是不支持多字节的, 我的VS2015 Update1正常,也没打MBCS补丁。]
像这样随便写两句代码:
CString str = "11";
SetWindowText("11");
就会提示报错
error C2440: “初始化”: 无法从“const char [3]”转换为“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”
note: class“ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>”的构造函数声明为“explicit”
error C2664: “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“const char [3]”转换为“LPCTSTR”, 没人知道怎么解决么,我也遇到这个问题了 , CString str = _T("11");, 要装MBCS补丁,到ms官网上去找, 我这没事vs2015 update3
而且unicode这个好用干嘛不用?, C++新标准 默认的char就是utf8字符 个人觉得挺好
最好新工程别再选unicode了 到时候转换的时候 到底是mbcs转utf16还是utf8转16呢?容易造成混乱 , CString str = "11";
SetWindowText("11");
改成
CString str = _T("11");
SetWindowText(_T("11"));, Cstring 与string 有啥区别, “”要装MBCS补丁,到ms官网上去找“”
好像是这样, MFC SetWindowText 是对 Windows API 的封装,编码只有一种,当然会有问题了。
而 CString 的运算符重载,一般都会有两个:针对 MBCS 和 Unicode 的不同版本。
一般来说,CString 不管是项目设置为何种编码,都是正确的:
CString str1 = "11";
CString str2 = L"11";
CString str3 = _T("11"); // 或 TEXT("11")
而 SetWindowText 则不同,ANSI/MBCS 就必须是:
SetWindowText("11");
Unicode 就必须是:
SetWindowText(L"11");
当然,你可以用任意一个 CString 来设置:
SetWindowText((LPCTSTR)str1);
SetWindowText((LPCTSTR)str2);
SetWindowText((LPCTSTR)str3);
那时因为 CString 的运算符重载会将任何编码转换为项目所设置编码,即与 SetWindowText 相符。, 检查下你的工程属性或代码中有没有其它地方设置UNICODE或_UNICODE这两个宏。, 我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把exe改成dll, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装. ,
据说要打多字节字符集补丁。, 你需要下载多字节的补丁,默认好像是不支持多字节的, 我的VS2015 Update1正常,也没打MBCS补丁。]