2009-12-21 21 views
4

將std :: wstring轉換爲std :: string的最簡潔方法是什麼?我過去曾使用過W2A等宏,但我從未喜歡它們。從寬到窄的字符

+0

這取決於你想要做什麼樣的轉換。很明顯,ASCII中存在的字符可以很容易地縮小,但'char'所使用的字符集中不存在的字符怎麼辦?還是有不同的編碼?你關心這些嗎?基本上,你想*正確*轉換,或只是適用於英文字符的東西? – jalf 2009-12-22 13:08:01

+0

在這種特殊情況下,假設所有讀取的字符都是窄格式是安全的。我正在閱讀的文件中只包含窄字符,但我試圖通過返回寬字符串的接口返回此信息。然而,對於更多案例的完整答案將是非常豐富的。 – DanDan 2009-12-31 15:21:36

+0

另外,當我寫出他的文件時,我必須把我的字符串變成窄字符。在這種情況下,我可能不得不去尋找普通的方形顯示字符。 – DanDan 2009-12-31 15:23:49

回答

2

最原始的方式是std::ctype<wchar_t>::narrow(),但這只不過比std :: copy更像gishu建議的,你仍然需要管理自己的緩衝區。

如果您不想執行任何翻譯,但只想要一行,您可以做std::string my_string(my_wstring.begin(), my_wstring.end())

如果你想要實際的編碼轉換,你可以使用locales/codecvt或其他答案的庫之一,但我猜這不是你想要的。

+0

在這種情況下,一個內襯工作正常。謝謝! – DanDan 2009-12-31 15:44:58

1

看看這是否有幫助。這個使用std :: copy來實現你的目標。

http://www.codeguru.com/forum/archive/index.php/t-193852.html

+0

但它只是調用從'wchar_t'到'c​​har'的隱式轉換,這基本上是整數值的賦值。它只適用於兩種編碼中存在的字符,並且在兩者中都具有相同的表示形式。 – jalf 2009-12-22 17:32:03

+0

那麼要從A轉換到B,在B的域中必須有一個等價的A.必須存在一個映射..不清楚你的意思是「兩者中的相同表示」。 – Gishu 2009-12-23 05:15:52

5

你可能會找什麼是icu,對於Unicode和傳統編碼處理以及許多其他的東西一個開源,跨平臺的庫。

+0

謝謝,這將在其他項目中有用。 – DanDan 2009-12-31 15:45:43

1

我不知道它是否「最乾淨」,但我已經使用copy()函數,沒有任何問題到目前爲止。

#include <iostream> 
#include <algorithm> 

using namespace std; 

string wstring2string(const wstring & wstr)  
{ 
    string str(wstr.length(),’ ‘); 
    copy(wstr.begin(),wstr.end(),str.begin()); 
    return str; 
} 

wstring string2wstring(const string & str) 
{ 
    wstring wstr(str.length(),L’ ‘); 
    copy(str.begin(),str.end(),wstr.begin()); 
    return wstr; 
} 

http://agraja.wordpress.com/2008/09/08/cpp-string-wstring-conversion/

+0

標準編碼實踐注意事項:當按值傳遞參數時,您爲每個字符串創建一個額外副本 - 而不是通過const引用傳遞它們。 – 2009-12-26 04:45:19

+0

很好趕上尼古拉,我會更新 – 2009-12-26 05:08:27

2

如果wstring的編碼是UTF-16,你想轉換爲UTF-8編碼的字符串,可以使用UTF8 CPP庫:

utf8::utf16to8(wstr.begin(), wstr.end(), back_inserter(str)); 
+0

謝謝,我喜歡這個樣子。 – DanDan 2009-12-31 15:46:16

1

由於這是搜索「C++窄字符串」的第一個結果之一,它來自C++ 11之前,這裏是解決此問題的C++ 11方法:

#include <codecvt> 
#include <locale> 
#include <string> 

std::string narrow(const std::wstring& str){ 
    std::wstring_convert< 
     std::codecvt_utf8_utf16<std::wstring::value_type>, 
     std::wstring::value_type 
    > utf16conv; 
    return utf16conv.to_bytes(str); 
}