Конвертируйте между строкой и строкой, получайте разные результаты "одинаковым" способом - PullRequest
0 голосов
/ 24 января 2019

Я использую функцию s2ws () (поиск в SO, если вы обнаружите что-то не так, пожалуйста, сообщите мне) конвертировать из строки в wstring, затем я использую tinyxml2 для чтения чего-то из xml. Как все мы знаем, некоторые из tinyxml2 Интерфейс использует 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 вернет символ *, функция 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;

1 Ответ

0 голосов
/ 25 января 2019

Я думаю, что нашел причину, я назначаю 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)?

...