string、Ctring、Wstring的区别以及宽字节与多字节的运用

     首先我个人认为,在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之间的转换.

    utf8conv.h

    这个头文件中提供了一个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编码即宽字节编码,区别如下:宽字节中都是占用两个字节,多字节中英文字符占用一个字节,汉字占用两个字节。通常转换使用函数:

 

#include <atlbase.h>

代码如下:

//使用ATL的W2A和A2W宏必须使用USES_CONVERSION
USES_CONVERSION;
 
//Unicode字符串
wchar_t* wszText=L"1.Unicode字符转换为ANSI;";
printf("%s/n",W2A(wszText));
 
//wprintf输出非英文字符,需要设置当前的地域信息
setlocale(LC_ALL,"chs");
 
//ANSI字符串(ANSI:American National Standards Institute)
//中文内码MBCSMulti-Byte character sets,英文内码SBCSSingle-Byte character sets)
char* szText="2.ANSI字符转换成Unicode.";
wprintf(L"%s/n",A2W(szText));

      第四:应用层与硬件底层通讯记录: 硬件通常是一次读取byte即一个字节处理,而vc++软件实现要处理ascii码转换步骤,比如在IDE界面输入:字符1。系统根据ascii码表查询数字1对应的十六进制31存入一个字节;如果输入ab,查表存入内存十六进制需要两个字节:61 62 。这是多字节存入法。硬件一次读出来的只有一个字符,所以ab需要两次读取。

     但是要使用宽字节存入即把ab存到一个字节中,必须使用转换函数stroll,硬件一次读一个byte,可以把ab一次性读取。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值