此方法经常用于VC写的DLL或ocx函数的返回值中,而且此DLL或ocx函数是供VB或JS调用的。
函数返回使用下面的格式返回
return SysAllocString((BSTR)wText);//wText是转换后的UNICODE字符串
或
return SysAllocString((BSTR)sText);//sText是转换后的多字节字符串
ANSI字符也叫多字节字符,短字符,汉字占用2个字节,ASCII字符占用1个字节,比如char sTemp[]="中间1";需要分配6个字节,最后一个字节是字符串结束字节(0值)。
UNICODE字符也叫宽字符,每一个字符(汉字或ASCII字符)占用2个字节(16位)。他们之间的相互转换使用下面两个函数
int MultiByteToWideChar(
__in UINT CodePage,//经常用CP_ACP
__in DWORD dwFlags,//经常为0
__in LPCSTR lpMultiByteStr,//多字节字符串
__in int cbMultiByte,//多字节字符串的长度,常用-1表示全部长度
__out LPWSTR lpWideCharStr,//转换后的UNICODE字符
__in int cchWideChar//存放UNICODE字符空间大小,
);
int WideCharToMultiByte(
__in UINT CodePage,,//经常用CP_OEMCP
__in DWORD dwFlags,//经常为0
__in LPCWSTR lpWideCharStr,//UNICODE字符串
__in int cchWideChar,//UNICODE字符串长度,常用-1表示全部长度
__out LPSTR lpMultiByteStr,//转换后的多字节字符串
__in int cbMultiByte,//存放多字节字符串空间的大小
__in LPCSTR lpDefaultChar,//经常为NULL
__out LPBOOL lpUsedDefaultChar//经常为FALSE
);
在不考虑空间浪费的情况下,转换较短的字符串(转换后字符空间在转换前固定,不使用动态分配),转换函数可封装成下面的两个函数
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);//得到实际需要的UNICODE字符空间大小
if(dwSize < dwMinSize)
{
return FALSE;
}
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
return TRUE;
}
/
BOOL WCharToMByte(LPCWSTR lpwszStr, LPSTR lpcszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,NULL,0,NULL,FALSE);//得到实际需要的多字符空间大小
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,lpcszStr,dwMinSize,NULL,FALSE);
return TRUE;
}
使用方法如下:
wchar_t wText[10] = L"函数示例";
char sText[20]= {0};//转换后字符空间在转换前固定,不使用动态分配
WCharToMByte(wText, sText, sizeof(sText)/sizeof(sText[0]));
MByteToWChar(sText, wText, sizeof(wText)/sizeof(wText[0]));
如果字符串很长,则可以考虑使用动态分配
先使用
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);//得到实际需要的UNICODE字符空间大小
或
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,NULL,0,NULL,FALSE);//得到实际需要的多字符空间大小
得到实际需要的大小,然后分配空间
wchar_t *wText = new wchar_t[dwMinSize];
或
char *sText = new char[dwMinSize]
最后调用
MByteToWChar(sText, wText, dwMinSize);
或
WCharToMByte(wText, sText, dwMinSize);