CString 如何转为wchar_t
如果提出用T2W 宏 方法的,请详细说下用法?(用到的头文件和vc6.0可编译通过的用法)]
当然还有很多解决方法,希望大家费心 展开
unicode下CString 转为wchar_t:
方法一:使用api:multibytetowidechar进行转换。
char * pfilename = "d:\\校内项目\\qq.bmp"; //计算char *数组大小,以字节为单位,一个汉字占两个字节int charlen = strlen(pfilename); //计算多字节字符的大小,按字符计算。
int len = multibytetowidechar(cp_acp,0,pfilename,charlen,null,0);//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小tchar *buf = new tchar[len + 1]; //多字节编码转换成宽字节编码。
multibytetowidechar(cp_acp,0,pfilename,charlen,buf,len); buf[len] = '\0'; //添加字符串结尾,注意不是len+1 //将tchar数组转换为cstringcstring pwidechar,pwidechar.append(buf); //删除缓冲区delete []buf。
方法二:使用函数:a2t、a2w。
char * pfilename = "d:\\校内项目\\qq.bmp";uses_conversion;cstring s = a2t(pfilename); //cstring s = a2w(pfilename)。方法三:使用_t宏,将字符串转换为宽字符。
//多字节字符集,在vc6和vc7种可以编译通过的语句,但vs2005不能通过,默认为unicode字符集//afxmessagebox("加载数据失败",0)。
//书写代码使用text("")或_t(""),文本在unicode和非unicode程序里都通用、afxmessagebox(_t("加载数据失败"),0)。
扩展资料:
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 对象的完整性得不到保障。
如果在你的程序中定义了符号_UNICODE,则TCHAR被定义为类型wchar_t,即16位字符类型;否则,TCHAR被定义为char,即8位字符类型。
在UNICODE方式下,CString对象由16位字符组成。非UNICODE方式下,CString对象由8位字符组成。
当不使用_UNICODE时,CString是多字节字符集(MBCS,也被认为是双字节字符集,DBCS)。注意,对于MBCS字符串,CString仍然基于8位字符来计算,返回,以及处理字符串,并且你的应用程序必须自己解释MBCS的开始和结束字节。
/////////////////////////
所以两者是不需要转换的,不知你怎么会出现需要转换的情况??
难道你在非UNICODE的情况下要转换成wchar_t?
那就要2楼所用的函数
MultiByteToWideChar
就是说在vs2005中,
WCHAR str=L"字符串";
CString str1=str;
是可以通过编译的,但到vc6中就不可以了
使用T2W宏必须先#include <ATLCONV.h>
然后在使用T2W宏前先执行一次
USES_CONVERSION;
这个宏实际上初始化了进行转换所需的环境。
最后用T2W((LPCTSTR)str)就可以把CString对象str转换成一个WCHAR字符串了!
wchar_t *w;
int l;
l = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)s, -1, NULL, 0);
w = new wchar_t[l];
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)s, -1, w, l);
delete []w;