2009-12-21 65 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); 
}