如何将wstring与_T(“some String”)进行比较?

时间:2016-08-08 09:15:25

标签: c++ visual-c++ compare

我有一个函数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;
}

1 个答案:

答案 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}}。