把char*转换为wchar_t*
用stdlib.h中的mbstowcs_s函数,可以通过下面的例子了解其用法:
char *CStr = "string to convert";
size_t len = strlen(CStr) + 1;
size_t converted = 0;
wchar_t *WStr;
WStr=(wchar_t*)malloc(len*sizeof(wchar_t));
mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);
其结果是WStr中储存了CStr的wchar_t版本。
把wchar_t*转换为char*
和上面的方法类似,用stdlib.h中的wcstombs_s函数,例子:
wchar_t *WStr = L"string to convert";
size_t len = wcslen(WStr) + 1;
size_t converted = 0;
char *CStr;
CStr=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);
这时WStr中的内容将被转化为char版本储存在CStr中。
另外还可以通过流的方法来char*类型转换为wchar_t*类型,但这样的转换得到的结果将是const类型,而类似的方法不能将wchar_t*类型转换为char*类型。
把(const)char*转换为const wchar_t*
需要用到 sstream 头文件:
char *cstr="string to convert";
wstringstream wss;
wss< 虽然stringstream流不能将wchar_t*转换成char*,但可以用来进行数值类型和字符串之间的转换,例如: double d=2734792.934f; stringstream ss; ss< string str("299792458"); stringstream ss; long i=0; ss< 此时i=299792458。 Unicode下CString(wchar_t)转换为 char* 平台VC2005,使用Unicode字符集。因为以前一直是用多字节字符集的,使用的str开头的函数都要转换 成_wcs,烦,最后,被CString类型无法转换为char*或char[]的错误搞得是火大了。 使用以前转换CString的方法或者网上别人的指导用法,都失效了 1.strcpy_s( pchar, sizeof(pchar), mCString.GetBuffer(mCString.GetLength()) );不行,mCString.GetBuffer()返回的是wchar_t数组,使用Unicode字符集时,wchar_t无法自动转换为char*. 2.strcpy_s(pchar, sizeof(pchar), (LPCSTR)_bstr_t(mCString));不行,"_bstr_t找不到识别符" 3.char *pch = (T2A)(LPSTR)(LPCTSTR)mCString; 也不行,"T2A是没声明的标识符",我补加上相应头文件AtlConv.h或AtlBase.h等的,也还是报错不改。 4.char *pch = (LPSTR)(LPCTSTR)mCString; 这样没有报错,但pch只能获得CString的第一个字符而已,第一个换成(char*),也只能获取第一个字符。郁闷。 5.CString.GetBuffer(CString.GetLength())不行。w_char*不能转为_char*。 正确方法: wstring MultCHarToWideChar(string str) { //获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的 int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0); TCHAR *buffer=new TCHAR[len+1]; //多字节编码转换成宽字节编码 MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len); buffer[len]='\\0';//添加字符串结尾 //删除缓冲区并返回值 wstring return_value; return_value.append(buffer); delete []buffer; return return_value; } string WideCharToMultiChar(wstring str) { string return_value; //获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的 int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL); char *buffer=new char[len+1]; WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL); buffer[len]='\\0'; //删除缓冲区并返回值 return_value.append(buffer); delete []buffer; return return_value; } 于是使用 string mstring = WideCharToMultiChar( (LPCTSTR)mCString ); strcpy_s( pach, sizeof(pach), mstring.c_str() ); 转换成功