2013-03-11 79 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的方式爲我。但是,這會失去一些獨特的人物。