首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

CString转char*的有关问题

2013-11-29 
CString转char*的问题最近在做C++与Matlab混编,在调用Matlab函数时需要传递参数,因此要把CString转char*,

CString转char*的问题
最近在做C++与Matlab混编,在调用Matlab函数时需要传递参数,因此要把CString转char*,网上找到了getbuffer来做的方法,但是试过了,只得到了字符串的第一个字符,请问是什么原因?

                char* mm;
CString ss;

ss=(".\\data\\chen-3s-2\\chen-3s-2_fea_realtime.mat");
mm=(char*)(ss.GetBuffer(ss.GetLength()));
                ss.ReleaseBuffer();
                //调试发现,mm只有一个'.'

                //弹出框显示是正常的
MessageBox(ss.GetBuffer(ss.GetLength()));                

                //kk也是正常的,完整的字符串
                char* kk=(".\\data\\chen-3s-2\\chen-3s-2_fea_realtime.mat");


CString转char*的问题 getbuffer
[解决办法]
你应该是用了UNICODE编码,每个字符都是双字节的,对于英文字符串来说,其UNICODE编码的第2个字节是0,所以你只能获取到第一个字母(因为接着就是0结尾了)。

所以char类型与wchar_t是不能直接强制转换的。具体还跟你程序选择的字符集有关系。解决办法有2种:
1.将你的工程改为本地多字符集就行。如果你是VC,一般在你工程项目属性的常规页面里面就有。
2.是在转换为char之前进行字符集转换。Windows下使用WideCharToMultiByte函数API就行。
如果不想跟底层API打交道,这里告诉你一个在VC中有效的UNICODE与本地多字节转换的诀窍:
那就是使用CStringW与CStringA。在VC的实现下,CString只是对前面两种类的重定义。更为重要的是前面两个类都有一个构造函数接收另外一个类型CString,其内部自动进行了字符集转换。
因此很简单了,转换代码如下:


CString str(_T("abcd")); //正常的CString,使用项目默认字符集,这里假设为UNICODE
CStringA strA(str);//使用CStringA,它有一个构造函数的实现自动将UNICODE编码转换为本地多字节码
const char* szBuf = (LPCSTR)strA;
//现在你可以使用szBuf了


一般来说,我们程序内部都会普遍使用UNICODE编码,当我们与一些老系统库接口时不得不面临转换为本地多字节编码的问题(对我们来说一般就是GBK)。CStringA的办法我一直用在我的MFC程序里,简单好用。

以上,仅限于UNICODE与本地多字节编码之间的转换,至于UTF-8之类的就不适用了(当然UTF-8的ASCII码部分是标准的ASCII编码,不会存在LZ的问题,只是中文乱码罢了)
其实,字符编码与字符类型其实还是有很多繁琐的细节的,而且单纯的说某字符串是UNICODE编码也是不严谨的,具体还是去问度娘或GOOGLE,我也是在多年前做我们自己的XML解析器的时候被折磨够呛,才仔细去了解这方面的内容。
[解决办法]
为什么这个一直有人问呢? 历史帖子一大把

wchar_t有些编码是XX 00 XX 00 XX 00这样,所以遇到00就没了,只有第一个.

“网上找到了getbuffer来做的方法,但是试过了,只得到了字符串的第一个字符,请问是什么原因?”
这些都是以讹传讹的东西,没必要GetBuffer,CString本身有operator const wchar_t*() const 这个转换.GetBuffer用来申请内存(如果不够),并返回内部缓冲区给别的地方填充用的

简单点用CT2A这个宏就可以。

热点排行