C++ - std :: wstring to std :: string - 快速和脏转换,用作std :: map中的键

Jac*_*ace 6 c++ stdstring

我找了一下上一个转换的最佳方法的建议std::wstring,以std::string-但一个快速和肮脏的转换用作一个关键std::map<std::string, int>对象.

地图非常大,并且已经很好地集成到项目中,并且只有少数键需要这种转换,因此我认为将地图更改为接受std::wstring键的地图将是浪费.

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

该应用程序是仅限Windows的应用程序.

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

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

谢谢!

Rom*_*lov 9

作为变种,我会去

std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );
Run Code Online (Sandbox Code Playgroud)

也许另一个答案更快(取决于字符串迭代器的实现),但这对我来说是一种更为标准的方式.但是,这将失去一些独特的角色.


Emi*_*lia 7

如果你对内容的语义不感兴趣,而只是对可比较的内容感兴趣,我只是将内部wchar []与一个加倍大小的char []结合起来并用它来初始化字符串(通过指定地址) /构造函数中的大小)

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

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

哟可以回去:

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

现在比较

std::cout << (nws==ws)
Run Code Online (Sandbox Code Playgroud)

应该打印1.

但是,请注意,这样地图中的顺序(结果operator<)是...因为存在0而模糊,并且不反映任何文本语义.然而搜索仍然有效,因为 - 无论模糊 - 它仍然是一个"秩序".

  • 如果这是一个unordered_map,我会担心字符串中的空字节.如果散列函数具有字符串的特殊化,则它可能会或可能不会尊重实际的std :: string大小,而是停留在第一个空字节处. (2认同)

use*_*932 7

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