我使用一个函数s2ws()(从SO中搜索,如果发现错误,请告诉我)从字符串转换为wstring,然后使用tinyxml2从xml读取内容。众所周知,tinyxml2的某些接口(interface)使用char *作为输入,返回值也是如此。

从字符串转换为wstring的原因是项目全部使用wchar_t类型来处理字符串。

/*
    string converts to wstring
*/
std::wstring s2ws(const std::string& src)
{
    std::wstring res = L"";
    size_t const wcs_len = mbstowcs(NULL, src.c_str(), 0);
    std::vector<wchar_t> buffer(wcs_len + 1);
    mbstowcs(&buffer[0], src.c_str(), src.size());
    res.assign(buffer.begin(), buffer.end() - 1);

    return res;
}


/*
    wstring converts to string
*/
std::string ws2s(const std::wstring & src)
{
   setlocale(LC_CTYPE, "");

   std::string res = "";

   size_t const mbs_len = wcstombs(NULL, src.c_str(), 0);

   std::vector<char> buffer(mbs_len + 1);

   wcstombs(&buffer[0], src.c_str(), buffer.size());

   res.assign(buffer.begin(), buffer.end() - 1);

   return res;
}

ClassES属性将返回char *,功能s2ws将字符串转换为wstring。这两种方法在映射m_UpdateClassification中获得不同的结果。第二种方法在#if 0和#endif之间。但是我认为这两种方式应该没有区别。

第二种方法转换后会得到空字符串,不知道为什么,如果有任何线索,请告诉我。
    typedef std::map<std::wstring, std::wstring> CMapString;
    CMapString   m_UpdateClassification;

    const wchar_t * First = NULL;
    const wchar_t * Second = NULL;

    const char *name = ClassES->Attribute( "name" );

    const char *value = ClassES->Attribute( "value" );

    std::wstring wname = s2ws(name);

    std::wcout<< wname << std::endl;

    First = wname.c_str();

    std::wstring wvalue = s2ws(value);

    std::wcout<< wvalue << std::endl;

    Second = wvalue.c_str();

#if 0
    First = s2ws(ClassES->Attribute( "name" )).c_str();
    if( !First ) { m_ProdectFamily.clear(); return FALSE; }

    Second = s2ws(ClassES->Attribute( "value" )).c_str();
    if( !Second ) { m_ProdectFamily.clear(); return FALSE; }
#endif

    m_UpdateClassification[Second] = First;

最佳答案

我想我找到了原因,我将wchar_t *设置为wstring,经过这样的修改代码,一切运行良好。

    std::wstring First = L"";

    std::wstring Second = L"";

    First = s2ws(ClassES->Attribute("name"));
    if( First.empty() ) { m_ProdectFamily.clear(); return FALSE; }

    Second = s2ws(ClassES->Attribute("value"));
    if( Second.empty() ) { m_ProdectFamily.clear(); return FALSE; }

另一个问题,我应该检查s2ws(mbstowcs)ws2s(wcstombs)的结果吗?

关于c++ - 在wstring和string之间转换,用 “same”方式得到不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54350372/

10-12 01:41