我有一个函数wstring A2T(const string& str)
可将string
转换为wstring
。但是当我将返回值与const wstring
进行比较时,我无法得到正确的值。例如;
wstring strOn = A2T("on");
if ( strOn == _T("on"))
{
SetItemSwitch(true);
}
else
{
SetItemSwitch(false);
}
if(strOn == _T("on"))
语句始终为false。我的代码出了什么问题?
这是A2T
:
std::wstring A2T(const string& str)
{
if (str.empty()) return std::wstring();
int sz = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
std::wstring res(sz, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], -1, &res[0], sz);
return res;
}
答案 0 :(得分:1)
问题在于对第一次调用MultiByteToWideChar
的返回值的解释(或使用) - 它将返回缓冲区所需的大小,包括终止NULL
字符。创建宽字符串时,应从大小中删除NULL
的计数,字符串将在内部添加。
另外,在第二次调用时,使用字符串的实际大小;这是为了避免MultiByteToWideChar
处理缓冲区,包括任何终止NULL
字符(它们的存在已经在字符串大小计算中得到满足)。同样,字符串将在内部管理NULL
。
std::wstring A2T(const std::string& str)
{
if (str.empty())
return std::wstring();
int sz = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
std::wstring res(sz - 1, 0);
// ^^^ count to "remove" the NULL
MultiByteToWideChar(CP_UTF8, 0, &str[0], str.size(), &res[0], res.size());
// ^^^ use actual sizes
return res;
}
根据所使用的编译器版本,您还可以调查res.data()
对&res[0]
的使用{/ 1}}。