开发者

Wide to narrow characters

W开发者_如何学编程hat is the cleanest way of converting a std::wstring into a std::string? I have used W2A et al macros in the past, but I have never liked them.


What you might be looking for is icu, an open-source, cross-platform library for dealing with Unicode and legacy encodings amongst many other things.


The most native way is std::ctype<wchar_t>::narrow(), but that does little more than std::copy as gishu suggested and you still need to manage your own buffers.

If you're not trying to perform any translation but just want a one-liner, you can do std::string my_string( my_wstring.begin(), my_wstring.end() ).

If you want actual encoding translation, you can use locales/codecvt or one of the libraries from another answer, but I'm guessing that's not what you're looking for.


Since this is one of the first results for a search of "c++ narrow string," and it is from before C++11, here is the C++11 way of solving this problem:

#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


If the encoding in the wstring is UTF-16 and you want conversion to a UTF-8 encoded string, you can use UTF8 CPP library:

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


See if this helps. This one uses std::copy to achieve your goal.

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


I don't know if it's the "cleanest" but I've used copy() function without any problems so far.

#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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜