当前位置:C++技术网 > 精选软件 > CStringA和CStringW相互转换解决宽窄字符函数使用问题

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

更新时间:2016-07-29 17:19:00浏览次数:1+次

    今天又被群里的朋友问起宽窄字符转换的问题。对于宽窄字符的解释,请阅读《字符集、字符编码、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字符集)。