VS2015 多字节字符集无效????这是BUG吗?大家有碰到吗?

时间:2023-01-16 20:18:35
用VS2015,建立一个新的MFC的工程,把工程设置为使用多字节字符集,加入一个多字节字符集类,不管怎么编译都是通不过的。如果是UNICODE的就没问题。
如果直接用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”, 没人知道怎么解决么,我也遇到这个问题了 VS2015 多字节字符集无效????这是BUG吗?大家有碰到吗?, 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, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装.    ,
引用 13 楼 waj19831 的回复:
我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把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”, 没人知道怎么解决么,我也遇到这个问题了 VS2015 多字节字符集无效????这是BUG吗?大家有碰到吗?, 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, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装.    ,
引用 13 楼 waj19831 的回复:
我经常遇到, 不仅修改字符集无效, 修改其他配置项也无效. 比如把exe改成dll, 再比如修改运行时库, 统统无效. 目前没有找到解决方法, 我这出现了就只能重装.    

据说要打多字节字符集补丁。, 你需要下载多字节的补丁,默认好像是不支持多字节的, 我的VS2015 Update1正常,也没打MBCS补丁。]