string和cstring互转
来源:互联网 发布:查看手机端口 编辑:程序博客网 时间:2024/06/10 01:28
1、互转
CString和string在unicode与非unicode下的相互转换
最近想写一个手机控制电脑的玩具,涉及到了socket通信,数据采用json通用格式,首先是jsoncpp的编译问题太烦了,然后还有更烦的,Java中的String多容易的玩意儿,然后到了c/c++/mfc中超级烦,搜索了很久的攻略,用了大把的时间,最后写了个这玩意儿出来,或许可以帮助到一些需要此的道友们哈
http://blog.csdn.net/u014303844/article/details/513975562、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());我试了一下编译器提示错误,如下图
用msnd上面的方法也有问题如下
尝试了许多都宣告失败了。
不知道是新版本编译器导致的问题,还是哪儿设置的不正确的问题。请不吝赐教。谢谢。
最终我使用了WideCharToMultiByte 但是还是想知道上面的方法在我这里就不行呢。
用msnd上面的方法也有问题如下
尝试了许多都宣告失败了。
不知道是新版本编译器导致的问题,还是哪儿设置的不正确的问题。请不吝赐教。谢谢。
最终我使用了WideCharToMultiByte 但是还是想知道上面的方法在我这里就不行呢。
回复讨论(解决方案)
CString cstr = _T("ABC");
USES_CONVERSION;
string str(W2A(cstr));
USES_CONVERSION;
string str(W2A(cstr));
因为CString里是WCHAR
string里是char
类型不匹配
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();
而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();
而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();
而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,用了网上推荐的办法试了好久发现如下办法可以用:
我用这个完美解决了我的问题。
我还用下面的解决了 string 转换为 CString 的问题
string tmpstr;
CString tmp1(tmpstr.c_str());
以上全部都是在VS 2013里用的。
主是要VS默认是宽字符造成的。
我用了如下的办法成功了,也是VS2013,用了网上推荐的办法试了好久发现如下办法可以用:
CString filepath;USES_CONVERSION;string tmpstr(W2A(filepath)); //这个tmpstr 就是转换完成的string对象。
我用这个完美解决了我的问题。
我还用下面的解决了 string 转换为 CString 的问题
string tmpstr;
CString tmp1(tmpstr.c_str());
以上全部都是在VS 2013里用的。
感谢楼上的各位给我细心讲解,由于刚接触VC++对微软的一大堆宏以及数据类型很混乱。现在想想应该宽字节的问题。
0 0
- CString和string互转
- string和cstring互转
- CString 转 String和String转CString
- string 和cstring
- CString和string区别
- CString和string区别
- CString和string区别
- string 和 cstring
- CString和string
- CString和string区别
- CString和string区别
- CString和string区别
- CString和string区别
- cstring和string区别
- CString/wstring、CString/string互转
- <string.h> <string> 和<CString>
- <string>、<cstring>和<string.h>
- CString与string互转
- 数组去重的几种方法-基础篇
- RIL 机制---rild守护进程
- Kali 2016.2 安装 OpenVAS 9 步骤
- POJ1579简单dp
- MySQL 学习<二> 数据库的基本操作
- string和cstring互转
- Hello world!!
- linux利用文件句柄恢复oracle数据
- POJ 2240 Arbitrage 最短路 Floyd
- Vijos P2010 回文日期【回文+日期计算】
- 字符串与数组和指针
- linux下gdb调试
- 获取当前进程的IAT
- Checkresult(西工大本科生成绩查询APP)项目