2013-03-11 57 views
6

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

地图相当大,已很好融入项目已有,并只有需要此转换,所以我认为这将是浪费的地图变成一个接受std::wstring键一小撮作为关键。

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

该应用程序是一个Windows应用程序。

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

编辑:请记住 - 失去信息是罚款只要东西是一致的。即如果我扔了一些日文字符,并且他们一直转换成相同的(可能是垃圾)std::string,那很好。这绝不会用于显示,只能用作从地图中提取值的关键。

谢谢!

+0

[adapter](http://en.wikipedia.org/wiki/Adapter_pattern)? – krlmlr 2013-03-11 07:35:27

+2

也许你应该将'std :: wstring'转换为[UTF-8](http://en.wikipedia.org/wiki/UTF-8),并将'std :: string'设置为该值。您将通过这种方式避免虚假的'\ 0'字节。 – 2013-03-11 07:55:38

+0

为什么你一直使用'std :: wstring'? [在任何地方使用UTF8。](http://utf8everywhere.org/) – 2013-03-11 08:49:41

回答

7

如果您对内容的语义不感兴趣,但仅仅为了内容的可比性,我会将内部的wchar []转换为double [size]的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

但是,请注意,由于存在0,因此地图中的顺序(operator<的结果)是...模糊的,并且不反映任何文本语义。然而,搜索仍然有效,因为 - 不管怎样模糊 - 它仍然是一个“订单”。

+1

这会分散操作员注意力:重点显然不是具有漂亮的打印输出,而是检查在一个循环中不会丢失信息。无论根据平等情况而变化的输出是否一样。我做了更短,更简单,不需要额外的标题。这取决于OP为他的需求找到最好的“美化者”(包括用MessageBox替换cout或任何他想要的任何对话框) – 2013-03-12 07:34:43

+2

如果这是一个unordered_map,我会关心字符串中的空字节。如果散列函数具有字符串专用性,则它可能会或可能不会尊重实际的std :: string大小,而是停在第一个空字节处。 – 2014-03-27 20:17:35

7

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

+0

+1:一个很好的发现。 – 2013-03-11 08:27:04

9

作为一种变型,我会去

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

也许对方的回答是更快(取决于字符串迭代器实现),但是这是一个更STD \ STL的方式为我。但是,这会失去一些独特的人物。

相关问题