宽字符转窄字符时候,简单测试没问题,但大批量运行的时候,往往容易出现意想不到的bug,经过多次跟踪调试,发现几个问题,经处理后,运行稳定,分享给大家,希望用上,尤其大批量调用的时候,无后顾之忧。
string WString2String(const std::wstring& ws)
{
//1这个方法,容易出现因电脑地域环境而改变,结果很多未知
/*std::string strLocale = setlocale(LC_ALL, "");
const wchar_t* wchSrc = ws.c_str();
size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;
char* chDest = new char[nDestSize]();
memset(chDest, 0, nDestSize);
wcstombs(chDest, wchSrc, nDestSize);
std::string strResult = chDest;
delete[]chDest;
chDest = NULL;
setlocale(LC_ALL, strLocale.c_str());
return strResult;*/
//2用下列方法时,在ChineseEmojiToUnicodeEmojiString内部转换时不完整,导致信息无法收到
/*int nwstrlen = WideCharToMultiByte(CP_ACP, 0, ws.c_str(), -1, NULL, 0, NULL, NULL);
if (nwstrlen > 0)
{
std::string str(nwstrlen, '\0');
WideCharToMultiByte(CP_ACP, 0, ws.c_str(), -1, (LPSTR)str.c_str(), nwstrlen, NULL, NULL);
return std::move(str);
}
return ("");*/
//3.这个方法目前很稳定,比例处理没问题
std::string res;
int len = WideCharToMultiByte(CP_ACP, 0, ws.c_str(), ws.size(), nullptr, 0, nullptr, nullptr);
if (len <= 0) {
return res;
}
char* buffer = new char[len + 1];
if (buffer == nullptr) {
return res;
}
WideCharToMultiByte(CP_ACP, 0, ws.c_str(), ws.size(), buffer, len, nullptr, nullptr);
buffer[len] = '\0';
res.append(buffer);
delete[] buffer;
buffer = NULL;
return res;
}
wstring String2WString(const std::string& s)
{
//这个方法不稳定,有时候出现乱码
//std::string strLocale = setlocale(LC_ALL, "");
//const char* chSrc = s.c_str();
//size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
//if (nDestSize > 0)
//{
// wchar_t* wchDest = new wchar_t[nDestSize]();//初始化为空
// //如果这个时候再用下面初始化,会容易产生意想不到的异常
// //wmemset(wchDest, 0, nDestSize);
// mbstowcs(wchDest, chSrc, nDestSize);
// std::wstring wstrResult = wchDest;
// delete[]wchDest;
// wchDest = NULL;
// setlocale(LC_ALL, strLocale.c_str());
// return wstrResult;
//}
//return L"";
std::wstring res;
int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), nullptr, 0);
if (len < 0) {
return res;
}
wchar_t* buffer = new wchar_t[len + 1];
if (buffer == nullptr) {
return res;
}
MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), buffer, len);
buffer[len] = '\0';
res.append(buffer);
delete[] buffer;
buffer = NULL;
return res;
}