WCHAR 和 char的相互转换
WCHAR 和 char的相互转换
char 转换成WCHAR很好转换,用L"",LP(""),_T(""),TEXT(""),将ASCII单字节字符转换成UNICODE字符还有很多方法,就列举一些。
然而微软给了我们那么多单字节转换成双字节的方法,为啥就没有找到一个简单的双字节转换单字节的方法呢?虽然unicode很好,很强大,但是还有许许多多的代码用的是ascii写的啊,难道说把别人写好了的代码再写一次吗?或者说别人封装成了dll,com,我们就没法了啊。。。
找了很久,没有发现微软给我们提供有直接的转换方法。【如果有记得一定跟帖】
没有办法,只有自己写了。
char * ch=new char[50];
WCHAR *p=new WCHAR[25];
p=_T(“made by crazy!”);
for(int i=0;i<wcslen(p);i++)
{
ch[i]=(char *)p[i];
}
ch[i]=’\0';
cout«ch;
ok!转换完成,如果谁有更好的方法,谢谢跟帖,大家一起分享。
睡觉了,明天写一个完整的函数出来。····
不好意思,由于小弟才疏学浅,导致了上面的解决办法误导了大家。对不起大家了,尽管上面的方法能够正确执行,但是有种多此一举的感觉。
经过长期考证:原来在C++标准里面已经提供了:
宽字节转单字节 : size_t wcstombs( char ***** mbstr , const wchar_t ***** wcstr , size_t count );
单字节转宽字节 : size_t mbstowcs( wchar_t ***** wcstr , const char ***** mbstr , size_t count );
上面这两个是标准C++的,下面两个好像是微软的函数。不过上面两个函数只能一个一个的转换,也就是说一次只能转换一个字符。下面两个方法就是 宽字符串与单字节字符串之间的转换。
宽字节转多字节 :WideCharToMultiByte //其实这里的多字节就是我们说的char
多字节转宽字节 :MultiByteToWideChar //多字节也就是ASCII单字节
这四种方法。
下面给一个 宽字符串 转换为 char字符串 的例子。
BSTR devname; //olewchar 其实就是wchar
char *name=NULL;
pNCP->get_Name(&devname);
DWORD n=WideCharToMultiByte(CP_OEMCP,NULL,devname,-1,NULL,0,NULL,FALSE);
name=new char[n];
WideCharToMultiByte(CP_OEMCP,NULL,devname,-1,name,n,NULL,FALSE);
cout<<name<<endl;
delete [] name;
下面是将 char字符串 转换为 unicode字符串,也就是宽字符。
char sText[20] = {“其实我就是所谓的多字节字符串”};
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, pwText, -1, sText, dwSize);
if(!pwText)
{
delete []pwText;
}