Windows编程中经常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题,于是自己总结了几种解决办法。
一、char* 转 LPCWSTR
1、通过T2W转换宏
char* szStr = "Mikasoi";
CString str = CString(szStr);
USES_CONVERSION;
LPCWSTR wszClassName = new WCHAR[str.GetLength()+1];
wcscpy((LPTSTR)wszClassName,T2W((LPTSTR)str.GetBuffer(NULL)));
str.ReleaseBuffer();
2、通过A2CW转换
char* szStr = "Mikasoi";
CString str = CString(szStr);
USES_CONVERSION;
LPCWSTR wszClassName = A2CW(W2A(str));
str.ReleaseBuffer();
3、通过swprintf()转换
char a[] = "";
strcat(a, "Mikasoi");
WCHAR wsz[64];
swprintf(wsz, L"%S", a);
LPCWSTR m_szFilename = wsz;
4、LPCWSTR实际上也是CONST WCHAR *类型,可以通过MultiByteToWideChar函数转换
char* szStr = "Mikasoi";
WCHAR wszClassName[256];
memset(wszClassName,0,sizeof(wszClassName));
MultiByteToWideChar(CP_ACP,0,szStr,strlen(szStr)+1,wszClassName,
sizeof(wszClassName)/sizeof(wszClassName[0]));
二、CString转LPCWSTR
1、方法一
CString strFileName;
LPCWSTR lpcwStr = strFileName.AllocSysString();
2、方法二
CString str = _T("Mikasoi");
USES_CONVERSION;
LPCWSTR lpcwStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。
三、LPCWSTR转换成CString
LPCWSTR lpcwStr = L"Mikasoi";
CString str(lpcwStr);
四、CString与const char*的相互转换
①CString强制类型转换为const char*,在变量前加上:(char *)(LPCTSTR),这样做虽不会报错,但其转换后的值可能是乱码,不推荐这样做!
②利用中间变量(string类型),原理:
1)const char*类型可自动装换为CString。
CString cs("Hello");
2)CString类型不能自动转换为const char*。但可以通过Cstring先转化为string,string再调用c_str()转换为const char*
a.Cstring 直接重载LPCTSTR,可以转换到string(在2005貌似编译不过)
CString cs("Hello");
std::string s((LPCTSTR)cs); //CString->string
b.std::string类型调用c_str()方法就可轻松转换为const char*。
std::string s("Hello");
const char* k = s.c_str(); //string->Const char*
使用下面的方法可以实现 Cstring(PCTSTR)转换为Const Char*
在Unicode环境下
char str[1024];
wsprintfA(str,"%ls",lpWideChars);
或者
CStringW strw = _T("test");
CStringA stra(strw.GetBuffer(0));
strw.ReleaseBuffer();
std::string imgpath=stra.GetBuffer(0);
stra.ReleaseBuffer();
非Unicode环境下:
CString strMfc=“test“;
std::string strStl;
strStl=strMfc.GetBuffer(0);