MFC与unicode的纠结

据说是由于从VC++6.0升级过来的代码,因为它的工程默认设置是非Unicode的,而vs2010工程的默认配置是Unicode的,所以在vs2010重写以前的代码的时候难免会出现这样以及那样 的问题,尤其是关于字符的问题。比如说:m_CityName.SetWindowTextA(city[t].c_str());(声明CStatic m_CityName,vector<string>city)出现的错误为: error C2039: “SetWindowTextA”: 不是“CStatic”的成员

和  m_List.AddString(city_name.c_str());出现的错误为:error C2664: “CListBox::AddString”: 不能将参数 1 从“const char *”转换为“LPCTSTR”!

还有 city.push_back(city_name.GetBuffer());出现的错误为: error C2664: “void std::vector<_Ty>::push_back(_Ty &&)”: 不能将参数 1 从“wchar_t *”转换为“std::string &&”

以及 对于出现“**”的字符串会出现错误:error:"const char *"类型的实参与"LPCTSTR"类型的形参不兼容

解决方法:方法1:最简单的方法就是通过设置vs2010的工程的通用属性的常规的字符集设置成“使用多字节字符集”就可以啦!

方法2:方法1虽然好,但是鉴于与时俱进以及与其它平台对接的原因,最好还是不改变vs2010的字符集。那么久需要修改具体的代码了。

一,对于m_CityName.SetWindowTextA(city[t].c_str()) 将其更改为 SetWindowTextA(m_CityName.m_hWnd,city[t].c_str());不知其所以然;

二,对于 m_List.AddString(city_name.c_str())将其改为USES_CONVERSION; m_List.AddString(A2CW(city_name.c_str()));也不知其所以然;

三,city.push_back(city_name.GetBuffer())将其改为: USES_CONVERSION; city.push_back(W2A(city_name.GetBuffer()));原因与第四个一样。  

四,对于字符串不兼容的,可以将"**"修改为:_T("**");  原因与第三个一样,是ANSII的CString的默认是窄字节的,而Unicode是宽字节的,_T在ANSI编译下表示ANSI串,在UNICODE下表示UNICODE串。在UNICODE下我们需要做宽窄字节的转换,比如:

USES_CONVERSION;
CString str;
std::string str1 = W2A(str.Getbuffer());
str.ReleaseBuffer();

                                                                                                                                                                                                                                                  2015.09.17更

unicode

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一杯拿铁go

你的打赏是我更新最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值