首先我个人认为,在MFC、ATL中使用字符串尽量使用CString,毕竟都是微软的孩子,各方面都比其它更有优势,而在非微软平台上或对移植性要求较高的场合推荐使用string,标准模板库提供了那么强大的泛型算法,没必要再自己去造车轮。
第二: string是C++提供的标准字符串操作类.wstring是操作宽字符串的类.
CString是对string(字符串)和wstring(宽字符串)的一个封装,常用在mfc中.用来解决编码问题的.
二.转换
string或者wstring转换到CString:
要把std::string或者std::wstring类型的数据存放到CString中,直接调用string::c_str()或者wstring::c_str()就行了.
CString转换到string或者wstring
CString::GetBuffer(0)就能转换到string或者wstring.如果编译时候定义了UNICODE,则转换到wstring;如果未定义,则转换到string.
string与wstring之间的转换
微软提供了一个工具,用于string和wstring之间的转换.
这个头文件中提供了一个utf8util 的命名空间,里面包含了如下的字符转换函数:
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 1: </span>std::wstring UTF16FromUTF8(<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">const</span> std::<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">string</span> & utf8); </span>
2: std::wstring UTF16FromUTF8(const char * utf8);
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 3: </span>std::<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">string</span> UTF8FromUTF16(<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">const</span> std::wstring & utf16); </span>
4: std::string UTF8FromUTF16(const wchar_t * utf16);
这个工具足够string与wstring之间的转换了.
其他:
string,wstring转数字
需要使用stringstream,wstringstream(都在sstream头文件中包含)
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 1: </span><span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">int</span> val;</span>
2: string str;
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 3: </span>stringstream ss (stringstream::<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">in</span> | stringstream::<span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">out</span>);</span>
4: ss << str;
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 5: </span>ss >> val;</span>
CString 转数字
_ttoi()这是个宏,如果定义了UNICODE,则等价于_wtoi(),否则对应atoi(),要使用,需要引入<stdlib.h>
数字转CString
<span style="font-size:18px;"><span class="lnum" style="color:#606060;LINE-HEIGHT: 1.5"> 1: </span><span class="kwrd" style="color:#00ff;LINE-HEIGHT: 1.5">int</span> iValue = 0;</span>
2: CString::Format(_T("%d") , iValue);
第三:string属于ANSII编码即多字节,而wstring和Cstring属于unicode编码即宽字节编码,区别如下:宽字节中都是占用两个字节,多字节中英文字符占用一个字节,汉字占用两个字节。通常转换使用函数:
代码如下:
//使用ATL的W2A和A2W宏必须使用USES_CONVERSION
第四:应用层与硬件底层通讯记录: 硬件通常是一次读取byte即一个字节处理,而vc++软件实现要处理ascii码转换步骤,比如在IDE界面输入:字符1。系统根据ascii码表查询数字1对应的十六进制31存入一个字节;如果输入ab,查表存入内存十六进制需要两个字节:61 62 。这是多字节存入法。硬件一次读出来的只有一个字符,所以ab需要两次读取。
但是要使用宽字节存入即把ab存到一个字节中,必须使用转换函数stroll,硬件一次读一个byte,可以把ab一次性读取。