项目里经常会用到这两种类型的转换,记录一下,这里如果有错误的,还请各位大佬指出
wchar_t* String_TCHAR(const string& pKey)
{
const char* pCStrKey = pKey.c_str();
//第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间
int pSize = MultiByteToWideChar(CP_ACP, 0, pCStrKey, -1, NULL, 0);
wchar_t *pWCStrKey = new wchar_t[pSize+1];
//第二次调用将单字节字符串转换成双字节字符串
MultiByteToWideChar(CP_ACP, 0, pCStrKey, -1, pWCStrKey, pSize);
pWCStrKey[pSize] = L'\0';
return pWCStrKey;//用完pWCStrKey后,记得delete
}
string WCHAR_String(wchar_t* pWCStrKey)
{
//第一次调用确认转换后单字节字符串的长度,用于开辟空间
int pSize = WideCharToMultiByte(CP_ACP, 0, pWCStrKey, -1, NULL, 0, NULL, NULL);
char* pCStrKey = new char[pSize + 1];
//第二次调用将双字节字符串转换成单字节字符串
WideCharToMultiByte(CP_ACP, 0, pWCStrKey, -1, pCStrKey, pSize, NULL, NULL);
pCStrKey[pSize] = '\0';
return pCStrKey;//用完pCStrKey 记得delete
}
其中主要用到的就是WideCharToMultiByte(双字节转单字节)和MultiByteToWideChar(单字节转双字节)这两个函数,至于为啥要调用两次,第一次是表示获取转换后的字符串长度,其中第四个参数设为-1表示的就是返回转换到字符串结尾的需要的长度,第二次调用第五个参数和第六个参数分别表示,转换后字符串存放的buffer和Size,保持和前面的获取的一致即可,至于为啥申请空间的时候长度加1,是为了让最后一个字符为'\0',符合字符串以'\0'结尾。
还有一个注意的是这两个函数有个区别,WideCharToMultiByte有8个参数,MultiByteToWideChar有6个参数。
后续我还会在此篇博客上更新其他的一些数据类型转换