一直觉得Unicode下的界面比较好看一些(MFC),所以一直都在Unicode环境下编程。
但是CString转char一直是个困扰人的问题。
现在终于找到了解决办法。
其实之所以弄了那么久都没有成功,还是源于自己的懒惰,舍不得真正花时间去寻找答案。
所以才会在每次编程,被这么一个问题给绊住脚。
在此,希望每一个像我一样懒惰的程序员能够认识到不足。^-^
稍微废话多了一点。原谅我,我只是想记录一下此刻的心情。
以下给出解决办法:
----------------------------------------------------------------------------------------------------------------------------------
1、Unicode下CString转换为char *
方法一:使用API:WideCharToMultiByte进行转换(我用的是这种方法)
CString str = _T("D://校内项目//QQ.bmp");
//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength(); // n = 14, len = 18
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * pFileName = new char[len+1]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '/0'; //多字节字符以'/0'结束
方法二:使用函数:T2A、W2A(没试过。。想用的请自己验证)
CString str = _T("D://校内项目//QQ.bmp");
//声明标识符
USES_CONVERSION;
//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
char * pFileName = T2A(str);
//char * pFileName = W2A(str); //也可实现转换
注意:有时候可能还需要添加引用#include <afxpriv.h>
------------------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------------------------------
另外附上多字符集下的CString和char间的相互转化
(1) char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
char chArray[] = "Char test";
TCHAR * p = _T("Char test");( 或LPTSTR p = _T("Char test");)
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
(2) CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一,使用强制转换。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
方法三,使用CString::GetBuffer。
如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。 如果你只是打算修改字符或者截短字符串,例如:
CString s(_T("Char test "));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, ''.'');
// 在这里添加使用p的代码
if(p != NULL)
*p = _T('');
s.ReleaseBuffer(); // 使用完后及时释放,以便能使用其它的CString成员函数
在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为ReleaseBuffer被调用之前,该 CString 对象的完整性得不到保障。
5.cstring 转换为unsigned char *
BYTE *nf[4];
//char* nf[4];
//m_IPADD.GetAddress(nf0,nf1,nf2,nf3);
CString resToken;
int curPos= 0, count = 1;
resToken= m_IPAddr.Tokenize(".",curPos);
nf[0] = (BYTE*)(LPCTSTR)resToken;
----------------------------------------------------依然朴素而华丽-----------------------------------------------------------------------------------------
以上内容全部为网上转载。具体出处已不明确。
未能标明出处,请大家原谅,请作者原谅。
--AmL.tu_s 2011.12.16