SORU
26 Ocak 2011, ÇARŞAMBA


Nasıl dize içine wstring dönüştürmek için?

Soru dizeye wstring dönüştürmek için nasıl?

Örneğin, bir sonraki var :

#include <string>
#include <iostream>

int main()
{
    std::wstring ws = L"Hello";
    std::string s( ws.begin(), ws.end() );

  //std::cout <<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;
    std::cout <<"std::string =     "<<s<<std::endl;
}

çıkış hattı diye :

std::string =     Hello
std::wstring =    Hello
std::string =     Hello

ama olmadan sadece :

std::wstring =    Hello

Bir şey yanlış örnek mi? Yukarıdaki gibi dönüşüm yapabilirim?

EDİT

Yeni örnek (hesaba bazı cevaplar alıyordu

#include <string>
#include <iostream>
#include <sstream>
#include <locale>

int main()
{
    setlocale(LC_CTYPE, "");

    const std::wstring ws = L"Hello";
    const std::string s( ws.begin(), ws.end() );

    std::cout<<"std::string =     "<<s<<std::endl;
    std::wcout<<"std::wstring =    "<<ws<<std::endl;

    std::stringstream ss;
    ss << ws.c_str();
    std::cout<<"std::stringstream =     "<<ss.str()<<std::endl;
}

Çıktı

std::string =     Hello
std::wstring =    Hello
std::stringstream =     0x860283c

bu nedenle stringstream dizeye wstring dönüştürmek için kullanılabilir.

CEVAP
22 AĞUSTOS 2013, PERŞEMBE


Cubbi yorumları std::wstring_convert (C 11) belirttiği gibi sağlar temiz ve basit bir çözüm yolu:

wstring string_to_convert;

//setup converter
typedef std::codecvt_utf8<wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;

//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes( string_to_convert );

Bu rastladım önce bellek kaldırma/wcstombs ve sıkıcı Ayırma Bir Arada kullanıyordum.

http://en.cppreference.com/w/cpp/locale/wstring_convert

güncelleme(2013.11.28)

Bir gömlekleri (yorum için Herkes Teşekkür ederim) şu şekilde ifade edilebilir:

std::wstring str = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes("some string");

Sarıcı işlevleri olarak ifade edilebilir: (yorum için ArmanSchwarz Teşekkürler)

wstring s2ws(const std::string& str)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}

string ws2s(const std::wstring& wstr)
{
    typedef std::codecvt_utf8<wchar_t> convert_typeX;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.to_bytes(wstr);
}

Not: bir tartışma olsun dizeleri/wstring geçirilmesi için fonksiyonları gibi kaynaklar ya da harfleri (nedeniyle 11 c ve derleyici güncellemeleri); bırakayım kararına kişi uyguluyor, ama buna değer bilmek.

Yukarıdaki kodu std::codecvt_utf8 kullanıyorum, ama değiştirmek gerekir utf-8 kullanıyorsanız değil, uygun kodlama için kullandığınız: not:

http://en.cppreference.com/w/cpp/header/codecvt

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • EvilControllers

    EvilControll

    20 Ocak 2008