我正在寻找关于将std::wstring
转换为std::string
的最佳方法的一些建议 - 但是快速而脏的转换用作std::map<std::string, int>
对象中的键
地图非常大,已经很好已经集成到项目中,并且只有少数几个键需要进行转换,所以我认为将地图更改为一个接受std::wstring
作为密钥的人。
转换的输出并不重要,但必须保持一致,以便每次都可靠地从地图中提取正确的值。
该应用程序是仅限Windows的应用程序。
是否有任何已知的过程可靠地为此目的进行粗略转换?或者最好的方法是通过通常的,正确的转换过程(如本问答/答案所述:How to convert wstring into string?)?
修改请注意 - 只要事情一致,丢失信息就可以了。即如果我输入一些日文字符,并且它们一直转换为相同的(可能是垃圾)std::string
,那很好。这绝不会用于显示,只能用作从地图中提取值的键。
谢谢!
答案 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 。这种转换是可逆的。