string CString wstring 之间的转化



当使用unicode字符集进行编译的时候,string、wstring、CString三者是有显著区别的。以下讨论均指在unicode字符集下。


特点:
string和wstring是C++标准的两个类型,CString是MFC的专用类型
string:其表示的字符串是多字节字符集,也就是说,其表示的字符串中的字符,英文字母和半角标点均只占用一个字节,而汉字和全角标点均占用两个字节;
wstring:其表示的字符串是unicode字符集,其表示的任何字符(不论英文字符还是汉字或者是标点)均占用2个字节;
CString:其表示的字符串是unicode字符集,其表示的任何字符(不论英文字符还是汉字或者是标点)均占用2个字节,并且和各个控件密切相关。


互相转化方式:
string -> CString :  
    string st("hello");
    CString cs(st.c_str());


CString -> string :
    CString cs("hello");
    string st = CStringA(cs); // 这点非常重要,一定要用等号初始化


CString -> wstring :
    CString cs("hello");
    wstring wst(cs);


wstring -> CString :
    wstring wst(L"hello"); // 这点很重要,wstring不能用char*类型初始化,但是可以用wchar_t*类型初始化
    CString cs(wst.c_str());


string -> wstring :
    string -> CString -> wstring


wstring -> string :
    wstring -> CString -> string


这里特别说明一下,有很多论坛和博客上都说用copy这个泛型算法可以搞定string和wstring之间的相互转化,其实这是不行的。比如string转化为wstring,用copy的话是将string的每个char,强制转化为wstring的每个wchar_t;反之也是把wstring的每个wchar_t强制转化为char。
这样看似没有什么问题,但是如果遇到中文或者全角标点的时候就会出问题了,互转了之后就会出现乱码。


因此借助CString来进行string和wstring的中间转化是最理想的。
如果不是MFC的环境,就要用mbstowcs_s和wcstombs_s这对C函数,不过用这对函数的时候不要忘记用setlocal来设置local
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值