string和cstring互转

来源:互联网 发布:查看手机端口 编辑:程序博客网 时间:2024/06/10 01:28

1、互转  

 CString和string在unicode与非unicode下的相互转换

最近想写一个手机控制电脑的玩具,涉及到了socket通信,数据采用json通用格式,首先是jsoncpp的编译问题太烦了,然后还有更烦的,Java中的String多容易的玩意儿,然后到了c/c++/mfc中超级烦,搜索了很久的攻略,用了大把的时间,最后写了个这玩意儿出来,或许可以帮助到一些需要此的道友们哈

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. string toString(CString cs) {   
  2. #ifdef _UNICODE  
  3.         //如果是unicode工程  
  4.         USES_CONVERSION;  
  5.         std::string str(W2A(cs));  
  6.         return str;  
  7. #else  
  8.         //如果是多字节工程   
  9.         std::string str(cs.GetBuffer());  
  10.         cs.ReleaseBuffer();  
  11.         return str;   
  12. #endif // _UNICODE   
  13.     }  
  14.   
  15.   
  16.     CString toCString(string str) {  
  17. #ifdef _UNICODE  
  18.         //如果是unicode工程  
  19.         USES_CONVERSION; CString s(str.c_str());  
  20.         CString ans(str.c_str());  
  21.         return ans;  
  22. #else  
  23.         //如果是多字节工程   
  24.         //string 转 CString  
  25.         CString ans;  
  26.         ans.Format("%s", str.c_str());  
  27.         return ans;   
  28. #endif // _UNICODE    
  29.     }  
http://blog.csdn.net/u014303844/article/details/51397556

2、cstring转string

CString filepath;USES_CONVERSION;string tmpstr(W2A(filepath));   //这个tmpstr 就是转换完成的string对象。
参考:http://www.itnose.net/detail/6110703.html

各位朋友大家好,近日用到mfc,其中需要用到CString 与  std::string 的互相转化。 开发环境是 vs2013 。 我看了网友的答案。有一下几个方法   CString---->string      string a(CString.GetBuffer());我试了一下编译器提示错误,如下图cstring,string,互相转化,mfc0 
用msnd上面的方法也有问题如下cstring,string,互相转化,mfc1 
尝试了许多都宣告失败了。 
不知道是新版本编译器导致的问题,还是哪儿设置的不正确的问题。请不吝赐教。谢谢。 
最终我使用了WideCharToMultiByte 但是还是想知道上面的方法在我这里就不行呢。

回复讨论(解决方案)

CString cstr = _T("ABC"); 
USES_CONVERSION; 
string str(W2A(cstr));
因为CString里是WCHAR 
string里是char 
类型不匹配
因为CString实际是CStringT, 也就是模板类, 它在UNICODE环境下, 实际是CStringW, 而在多字符集下是CStringA 
而std::string就是多字符集的. 

因为你的环境可能是UNICODE的, 所以说实际是CStringW, 要转换成多字符集, 当然就只有转码了. 

CStringW  ----> std::string  需要使用WideCharToMultiByte 转换成多字符集, 然后再构造std::string 

std::string -----> CStringW就简单了    因为CStringT模板类已经自动做了 char *  到 wchar_t* 的转码. 
CString Str; 
std::string  tStr; 
Str = tStr.c_str();   //注意, CStringT只做了 =号操作符char*到wchar_t*的自动转码. 

如果你把你的VS环境切换成多字符集, 那就更简单了. 
CString 实际就是CStringA. 

CStringA ----> std::string  : 
CString Str; 
std::string  tStr = Str; 


std::string -----> CStringA 
std::string  tStr; 
CString Str = tStr.c_str();
因为CString实际是CStringT, 也就是模板类, 它在UNICODE环境下, 实际是CStringW, 而在多字符集下是CStringA 
而std::string就是多字符集的. 

因为你的环境可能是UNICODE的, 所以说实际是CStringW, 要转换成多字符集, 当然就只有转码了. 

CStringW  ----> std::string  需要使用WideCharToMultiByte 转换成多字符集, 然后再构造std::string 

std::string -----> CStringW就简单了    因为CStringT模板类已经自动做了 char *  到 wchar_t* 的转码. 
CString Str; 
std::string  tStr; 
Str = tStr.c_str();   //注意, CStringT只做了 =号操作符char*到wchar_t*的自动转码. 

如果你把你的VS环境切换成多字符集, 那就更简单了. 
CString 实际就是CStringA. 

CStringA ----> std::string  : 
CString Str; 
std::string  tStr = Str; 


std::string -----> CStringA 
std::string  tStr; 
CString Str = tStr.c_str();

+1 

这牵扯到字符集的问题:char/wchar_t 

如果你的工程是多字符集的,按照你提到的那位网友的说法是正确的 
如果你的工程是Unicode字符集的,必须进行转换才可以(WideCharToMultiByte )
一楼说得好啊
因为CString实际是CStringT, 也就是模板类, 它在UNICODE环境下, 实际是CStringW, 而在多字符集下是CStringA 
而std::string就是多字符集的. 

因为你的环境可能是UNICODE的, 所以说实际是CStringW, 要转换成多字符集, 当然就只有转码了. 

CStringW  ----> std::string  需要使用WideCharToMultiByte 转换成多字符集, 然后再构造std::string 

std::string -----> CStringW就简单了    因为CStringT模板类已经自动做了 char *  到 wchar_t* 的转码. 
CString Str; 
std::string  tStr; 
Str = tStr.c_str();   //注意, CStringT只做了 =号操作符char*到wchar_t*的自动转码. 

如果你把你的VS环境切换成多字符集, 那就更简单了. 
CString 实际就是CStringA. 

CStringA ----> std::string  : 
CString Str; 
std::string  tStr = Str; 


std::string -----> CStringA 
std::string  tStr; 
CString Str = tStr.c_str();


---------------------------------------------------------------------------------------- 
说的很清楚了
3楼上说的很详细了,就是unicode和多字符集的问题。。。你可以改变字符集设置为多字符集,就没困扰了。。。
Unicode下,需要将CString -> char*
改成多字符集就可以了。
楼主这个问题我正好也碰到了 
主是要VS默认是宽字符造成的。 
我用了如下的办法成功了,也是VS2013,用了网上推荐的办法试了好久发现如下办法可以用: 
CString filepath;USES_CONVERSION;string tmpstr(W2A(filepath));   //这个tmpstr 就是转换完成的string对象。

我用这个完美解决了我的问题。 
我还用下面的解决了 string 转换为 CString 的问题 
string tmpstr; 
CString tmp1(tmpstr.c_str()); 

以上全部都是在VS 2013里用的。 
cstring,string,互相转化,mfc2
感谢楼上的各位给我细心讲解,由于刚接触VC++对微软的一大堆宏以及数据类型很混乱。现在想想应该宽字节的问题。

0 0
原创粉丝点击