微信号:cpp_coder

介绍:最专业的C/C++编程学习和程序员发展的综合平台.提供C/C++、汇编语言等、STL、MFC、QT等等学习、数据结构算法思维分析、各领域项目经验分享、资源下载、招聘和资讯的综合服务.

CStringA和CStringW相互转换解决宽窄字符函数使用问题

2016-07-31 23:18 cpp_coder

使用CString内部实现了宽窄的转换,然后再利用宽宽字符和窄窄字符在STL、MFC和C语言之间的转换,就可以非常灵活的解决宽窄字符函数使用问题了。

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。

    今天又被群里的朋友问起宽窄字符转换的问题。对于宽窄字符的解释,请阅读《字符集、字符编码、C语言字符编码、宽字符之间的关系全面分析》。而就宽窄字符的互换问题,我们可以使用Windows的API函数直接处理,参见《宽字符串与窄字符串的相互转换》。
    当然,如果你在MFC的开发环境中,上述的方法显得非常麻烦。只是你不能利用MFC的环境下,可以选用上述方法,在MFC中,我们可以利用CString类实现这个转换,就比较简单了。但是这样的用法很多人并不熟悉,所以还在到处碰壁。
    我们利用MFC的东西,就经常遇到宽字符函数。有的Windows的API函数还只有Unicode宽字符版本,所以,我们习惯了C语言的字符串风格是很郁闷的。如果你不进行宽窄字符混合编程时,字符串处理是很简单的,一旦混合起来,如果不能将宽窄字符混用用的很溜,经常被卡在这里。
    我们经常会用到C语言的转换函数,如atoi,还会用到CString。默认情况下,项目的字符集是Unicode,也就是宽字符集,此时CString对应的是CStringW,即宽字符类型。这宽字符对应着std::wstring。要想STL的wstring和MFC的CStringW互通互用,记住,使用字符串缓冲地址,而不是类之间直接操作。字符串缓冲地址对应着C字符串的wchar_t*类型。这样就将几个类型串在了一起。原理就是使用C语言字符串作为基础媒介。
    所以,取字符串缓冲地址操作如下:

wstring str1=L"http://www.cjjjs.com"; 
wchar_t* pSTLstr = str1.c_str(); 
CStringW str2=L"www.cjjjs.com"; 
wchar_t* pMFCstr = str2.GetBuffer(); 
str2.ReleaseBuffer();


    此时,pSTLstr和pMFCstr所指的内容结构是一模一样的,只是两者所指的字符串是存储在不同的位置而已。但是两个指针可以交换指向。
    同理,你可以将CStringA、string和char*以上面的方式串起来。代码如下:

string str1="http://www.cjjjs.com"; 
char* pSTLstr = str1.c_str(); 
CStringA str2="www.cjjjs.com"; 
char* pMFCstr = str2.GetBuffer(); 
str2.ReleaseBuffer();


    这是在宽宽字符和窄窄字符在STL、MFC和C语言之间的转换做法。那么我们要做宽窄的转换,我们可以直接方便的利用MFC的CString类来实现。而STL实现起来不太方便,也就没有研究,如果你知道,请提供STL的宽窄的转换方法。
    CString的构造函数支持直接将窄字符变成宽字符,可以这样使用:

CStringA strA="http://www.cjjjs.com"; 
CStringW strW(strA);


    这样strW就拥有了strA一样的字符串了。所以窄转宽是很方便的。那么宽转窄呢?CString的构造函数并不支持这么做,所以要绕一下路。代码如下:

CStringW strW = L"http://www.cjjjs.com"; 
CStringA strA;//这里不能用构造函数转换 
strA = strW;//可以利用赋值构造函数。


    虽然普通的构造函数不能实现宽字符到窄字符的转换,但是CString的赋值构造函数可以帮我们实现,只是多写了代码而已。
    我们这样使用CString内部实现了宽窄的转换,然后再利用宽宽字符和窄窄字符在STL、MFC和C语言之间的转换,就可以非常灵活的解决宽窄字符函数使用问题了。而CString则根据项目的字符集来替换CStringA(多字节字符集)或者CStringW(unicode字符集)。

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。

关注微信号,回复“干货”获取干货下载地址(干货即项目源码哦!)或者登陆个人中心下载


 
CPP技术网 更多文章 关于类型转换优先级的问题 怎样保护 程序不被删除 PictureBox图片自适应,图片文件流转换成字节流 如何修改MFC属性页窗口的字体[批量修改控件字体] 父类指针强制转换子类指针问题
猜您喜欢 微博红包:大规模Docker集群实践经验分享 程序猿捡到一部Android手机之后是无节操的去破解还是高尚的归还? 深度揭秘阿里移动端高性能动态化方案Weex Google是怎么做负载均衡器的 #架构#亿级用户下的新浪微博平台架构