写之前声明一下, 此篇日志参考与《把脉VC++》。
两种方法如下:
1、利用Windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数的原型如下:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
望文生义,WideCharToMultiByte()用来将宽字符转换成MBCS,MultiByteToWideChar()用以将MBCS转换成宽字符。通常情况下,我们可能开始并不知道转换之后的字符串会占用多大的字节,这个时候我们可以将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte()和MultiByteToWideChar(),它们的返回值即为目标字符串的字节大小,然后再利用该大小作为参数cbMultiByte,再次调用函数即可。
提示:将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte(),即可获取到目标字符串的大小,类似于这样的预先"喽一眼"输出缓冲区大小的操作,其实在Windows API中还是很常见的。通常我们将某个参数或者结构参数的成员置为NULL或者0,调用相同的API函数,即可达到"喽一眼"的效果,然后根据获取到的大小值来分配合适的内存。
2、用_bstr_t类来实现字符编码的转换。这种方法相当的管用,_bstr_t提供如下构造函数:
class _bstr_t {
public:
// Constructors
//
_bstr_t() throw();
_bstr_t(const _bstr_t& s) throw();
_bstr_t(const char* s) throw(_com_error);
_bstr_t(const wchar_t* s) throw(_com_error);
_bstr_t(const _variant_t& var) throw(_com_error);
_bstr_t(BSTR bstr, bool fCopy) throw(_com_error);
...
可以看出,_bstr_t同时支持char *和wchar_t *类型。_bstr_t提供了如下转换操作符函数:
// Assignment operators
//
_bstr_t& operator=(const _bstr_t& s) throw();
_bstr_t& operator=(const char* s) throw(_com_error);
_bstr_t& operator=(const wchar_t* s) throw(_com_error);
_bstr_t& operator=(const _variant_t& var) throw(_com_error);
下面我们就动手做一做吧:
#include <iostream>
#include <windows.h>
#include <comdef.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "chs"); //配置地域化信息
char s1[] = "AB汉字";
wchar_t s2[] = {0x41,0x42,0x6c49,0x0}; //"AB汉"或者是这样赋值:L"AB汉";
//1、使用xtoy转换
//s2-->p1
//第一次调用,计算MBCS字符串字节长度
int len1 = WideCharToMultiByte(
CP_ACP,
0,
s2, //宽字符串指针
sizeof(s2), //宽字符串长度
NULL,
0, //参数0表示计算转换后的字符空间
NULL,
NULL);
char * p1 = new char[len1];
WideCharToMultiByte(
CP_ACP,
0,
s2, //宽字符串指针
sizeof(s2), //宽字符串长度
p1, //转换后的字符串指针
len1, //给出空间大小
NULL,
NULL);
printf("%s\r\n", p1);
delete [] p1;
//s1-->p2
//第一次调用,计算宽字符串字节长度
int len2 = MultiByteToWideChar(
CP_ACP,
0,
s1, //MBCS字符串指针
sizeof(s1), //MBCS字符串长度
NULL,
0);
wchar_t * p2 = new wchar_t[len2];
MultiByteToWideChar(
CP_ACP,
0,
s1, //MBCS字符串指针
sizeof(s1), //MBCS字符串长度
p2, //转换后的字符串指针
len2);
printf("%S\r\n", p2);
delete [] p2;
//2、使用BSTR完成转换
_bstr_t bs1(s1);
_bstr_t bs2(s2);
char * bp1 = bs2; //convert
printf("%s\r\n", bp1);
wchar_t * bp2 = bs1; //convert
printf("%S\r\n",bp2);//大写S
return 0;
}
输出结果如图所示: