广泛到狭窄的人物

时间:2009-12-21 11:03:44

标签: c++ windows string stl

将std :: wstring转换为std :: string的最简洁方法是什么?我过去使用过W2A等人的宏,但我从来都不喜欢它们。

6 个答案:

答案 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 );
}

答案 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/