百度了半天,大家的介绍很多,但是发现不全面,一直解决不了问题,综合下自己的情况分享下自己的解决办法。
首先网上最常见的转换是这样的:
CString str("Test");
char *p=(LPSTR)(LPCTSTR)str;
或者
char *p=(char *)(LPCTSTR)str;
以上的方法不会报错,但是忽略了一个问题,那就是你的编译环境是怎样的,如果你是UNICODE,那么存储字符串时是两个字节两个字节的,这样强制转换会出现乱码的,特别是数字字符串的时候,直接就被截断了,例如:“12345”, 通过上面的转换后存入p里面的值只有“1“,因为内存里面两字节的1后两位是0,就相当于字符串结束了。
以下是自己的解决办法,希望对大家有用:
CString str;
#ifdef UNICODE
wchar_t *lp = (LPTSTR)(LPCTSTR)str; //如果是unicode编码 要先转换为两字节类型的字符串
char cp[256]; //这儿简单操作就不动态分配了
int len= WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),NULL,0,NULL,NULL); //宽字节变为单字节
WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),cp,len,NULL,NULL);
cp[len]='\0';
#else
char *sp = (LPSTR)(LPCTSTR)str; //如果是单字节的可以直接这么使用
#endif
以下对转换的过程做一下封装免得每次都要写一大段代码:
//CString转换为char * 注意CString已确定为unicode编码
char * CString2Char(CString str)
{
wchar_t *temp = (LPTSTR)(LPCTSTR)str;//获得的是CString的地址,不能修改指向的值
return WChar2Char(temp);
}
//线程不安全 不能多线程调用
char * WChar2Char(wchar_t *str)
{
/*因为返回的内存要不停的申请与释放,而且释放很不方便,
这儿用局部静态变量,但由于长度限制为10240字节,使用时
要小心,当长度大于10240时要适当做扩展*/
static char p[10240];//10k
memset(p, 0, sizeof(char)*10240);//p会保留上次的结果,这儿最好初始化一下
int len= WideCharToMultiByte(CP_ACP,0,str,wcslen(str),NULL,0,NULL,NULL);
if (len >= 10240)
return NULL;
WideCharToMultiByte(CP_ACP,0,str,wcslen(str),p,len,NULL,NULL);
p[len]='\0';
return p;
}
这样上面的代码就可以简化了,以后调用也方便多了
CString str;
char *p;
#ifdef UNICODE
p = CString2Char(str);
#else
p = (LPSTR)(LPCTSTR)str;
#endif