簡體   English   中英

C ++ - std :: wstring to std :: string - 快速和臟轉換,用作std :: map中的鍵

[英]C++ - std::wstring to std::string - quick and dirty conversion for use as key in std::map

我正在尋找關於將std::wstring轉換為std::string的最佳方法的一些建議 - 但是在std::map<std::string, int>用作鍵的快速而臟的轉換std::map<std::string, int>對象。

地圖非常大,並且已經很好地集成到項目中,並且只有少數鍵需要這種轉換,所以我認為將地圖更改為接受std::wstring作為鍵的地圖將是浪費。

轉換的輸出並不重要,但必須保持一致,以便每次都可靠地從地圖中提取正確的值。

該應用程序是僅限Windows的應用程序。

是否有任何已知的過程可靠地為此目的進行粗略轉換? 或者最好的方法是通過通常的,正確的轉換過程(如本問題/答案中所述: 如何將wstring轉換為字符串? )?

編輯:請記住 - 只要事情一致,丟失的信息就可以了。 即如果我輸入一些日文字符,並且它們一直轉換為相同的(可能是垃圾) std::string ,那很好。 這永遠不會用於顯示,只能用作從地圖中提取值的鍵。

謝謝!

作為變種,我會去

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

也許另一個答案更快(取決於字符串迭代器的實現),但這對我來說是一種更為標准的方式。 但是,這將失去一些獨特的角色。

如果你對內容的語義不感興趣,而只是對可比較的內容感興趣,我只是將內部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而模糊,並且不反映任何文本語義。 然而搜索仍然有效,因為 - 無論模糊 - 它仍然是一個“秩序”。

你可以將std :: wstring轉換為utf-8(使用WideCharToMultiByte或者像這樣的lib: http//utfcpp.sourceforge.net/ ),也就是一個空終止的c-string,然后構造std :: string從中。 這種轉換是可逆的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM