6

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

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

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

该应用程序是一个仅限 Windows 的应用程序。

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

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

谢谢!

4

3 回答 3

10

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

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 的存在,地图中的顺序( 的结果)是......模糊的,并且不反映任何文本语义。但是搜索仍然有效,因为 - 无论多么模糊 - 它仍然是一个“订单”。

于 2013-03-11T07:46:04.090 回答
9

作为一个变体,我会去

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

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

于 2014-06-23T10:49:15.057 回答
8

您可以将 std::wstring 转换为 utf-8(使用 WideCharToMultiByte 或类似这个库:http ://utfcpp.sourceforge.net/ ),即一个以空值结尾的 c-string,然后构造 std::string从中。这种转换是可逆的。

于 2013-03-11T08:15:11.590 回答