gpt4 book ai didi

c++ - 在 wstring 和 string 之间转换,用 "same"方式得到不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:30 28 4
gpt4 key购买 nike

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

string转wstring的原因是项目都是用wchar_t类型来处理string。

/*
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-Attribute 将返回 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com