【发布时间】:2019-01-24 15:42:28
【问题描述】:
我使用函数 s2ws()(从 SO 中搜索,如果发现错误请告诉我)从字符串转换为 wstring,然后我使用 tinyxml2 从 xml 中读取内容。众所周知,一些 tinyxml2接口使用 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;
【问题讨论】:
-
地图是什么? (给我看定义)键是指针吗?另外,您如何检测地图中的内容?
-
@doctorlove typedef std::map<:wstring std::wstring> CMapString;
-
@doctorlove 添加地图信息 <:wstring>.
-
在 ifdef'd out 片段中,您正在临时调用 c_str() 并存储结果。这不可能。