c++ - std::wstring到std::string的快速转换,用作std::map中的键

C++ - std::wstring to std::string - quick and dirty conversion for use as key in std::map

本文关键字:std 用作 map 转换 wstring string c++      更新时间:2023-10-16

我正在寻找一些关于将std::wstring转换为std::string的最佳方法的建议-但是在std::map<std::string, int>对象中用作键的快速和肮脏的转换。

地图是相当大的,并且已经很好地集成到项目中,并且只有少数几个键需要这种转换,所以我认为将地图更改为接受std::wstring作为键是浪费的。

转换的输出实际上并不重要,但它必须是一致的,以便每次都可靠地从映射中提取正确的值。

该应用程序是Windows专用的应用程序。

是否有任何已知的过程来做一个粗略的转换可靠的这个目的?或者最好的方法是通过通常的,适当的,转换过程(如在这个问题/答案中所述:如何将wstring转换为字符串?)?

编辑:请记住-丢失信息是好的只要的事情是一致的。例如,如果我加入一些日文字符,并且它们始终转换为相同的(可能是垃圾的)std::string,那就没问题了。这将永远不会显示,只用作从映射中提取值的键。

谢谢!

作为一种变体,我会选择

std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );

也许另一个答案更快(取决于字符串迭代器的实现),但对我来说,这是一种更std/stl的方式。是的,这会失去一些独特的字符

如果您对内容的语义不感兴趣,而只是对要比较的内容感兴趣,我将把内部的wchar[]凝聚成一个双倍大小的char[],并使用它来初始化字符串(通过在构造函数中指定地址/大小)

std::wstring ws(L"ABCD€FG");
std::string s((const char*)&ws[0], sizeof(wchar_t)/sizeof(char)*ws.size());

现在s是不可打印的(它可能包含空字符),但仍然可分配和比较。

你可以回到:

std::wstring nws((const wchar_t*)&s[0], sizeof(char)/sizeof(wchar_t)*s.size());

现在比较

std::cout << (nws==ws)

应该打印1

然而,请注意,这样在映射(operator<的结果)中的顺序是…模糊是因为0的存在,而不反映任何文本语义。然而,搜索仍然有效,因为-无论多么模糊-它仍然是一个"顺序"。

您可以将std::wstring转换为utf-8(使用WideCharToMultiByte或类似于此库:http://utfcpp.sourceforge.net/的东西),即一个终止null的c-string,然后从中构造std::string。这个转换是可逆的