将std :: wstring转换为std :: string的最简洁方法是什么?我过去使用过W2A等人的宏,但我从来都不喜欢它们。
答案 0 :(得分:5)
您可能正在寻找的是icu,这是一个开源的跨平台库,用于处理Unicode和遗留编码等许多其他内容。
答案 1 :(得分:3)
最原生的方式是std::ctype<wchar_t>::narrow()
,但这比gishu建议的std :: copy更多,你还需要管理自己的缓冲区。
如果您没有尝试执行任何翻译,但只想要一行,您可以std::string my_string( my_wstring.begin(), my_wstring.end() )
。
如果你想要实际的编码翻译,你可以使用locales / codecvt或其他答案中的一个库,但我猜这不是你想要的。
答案 2 :(得分:3)
由于这是搜索“c ++ narrow string”的第一个结果之一,并且它来自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 );
}
std::wstring_convert
:http://en.cppreference.com/w/cpp/locale/wstring_convert std::codecvt_utf8_utf16
:http://en.cppreference.com/w/cpp/locale/codecvt_utf8_utf16 答案 3 :(得分:2)
如果wstring中的编码是UTF-16,并且您希望转换为UTF-8编码的字符串,则可以使用UTF8 CPP库:
utf8::utf16to8(wstr.begin(), wstr.end(), back_inserter(str));
答案 4 :(得分:1)
看看这是否有帮助。这个使用std :: copy来实现你的目标。
http://www.codeguru.com/forum/archive/index.php/t-193852.html
答案 5 :(得分: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/