当使用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