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

时间:2013-03-11 07:26:31

标签: c++ stdstring

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

地图非常大,已经很好已经集成到项目中,并且只有少数几个键需要进行转换,所以我认为将地图更改为一个接受std::wstring作为密钥的人。

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:9)

作为一种变体,我会选择

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

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

答案 1 :(得分:7)

如果你对内容的语义不感兴趣,而只是对可比较的内容感兴趣,我会将内部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的存在而变得模糊,并且不反映任何文本语义。然而搜索仍然有效,因为 - 如果模糊 - 它仍然是一个“秩序”。

答案 2 :(得分:7)

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