如何比较一根绳子和一根_T("some String")?

How to compare a wstring with a _T("some String")?

本文关键字:一根 何比较 some String 比较      更新时间:2023-10-16

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

问题在于对第一次调用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()使用std::basic_string::data而不是&res[0]