2010-11-19 10 views
0

Ich versuche Textpakete über das Netzwerk mit Winsock zu senden. Der Text wird jedoch als wchar_t gespeichert und ich muss in der Lage sein, den Text für das Senden über das Netzwerk in das Byte-Format (char) zu konvertieren, das dann in wchar_t zurückkonvertiert wird.Senden Unicode (Win32) Textpakete über das Netzwerk mit Winsock?

Ich habe mit der Verwendung von ostringstream experimentiert und habe die wchar_t-Zeichenkette von mir in das umgewandelt, was wie Byte-Format aussieht, aber wenn ich versuche, umgekehrt zu gehen, bekomme ich eine Ladung Kauderwelsch.

Ich kann nicht scheinen, irgendwelche Antworten beim Schauen online zu finden, so würde jede Hilfe sehr geschätzt werden.

OK hier ist ein Code, mit dem ich gespielt habe.

std::wstring text(ieS("Hello")); 
std::ostringstream ostr; 
ostr.imbue(std::locale()); 
ostr << text.c_str(); 
std::string text2 = ostr.str(); 

In std :: string konvertieren, um das Zeichenformat zu erhalten.

std::wostringstream wostr; 
wostr.imbue(std::locale()); 
wostr << text2.c_str(); 
text = oss.str(); // gibberish 

Konvertieren zurück in std :: wstring Wchar_t Format zu bekommen ...

+0

Geben Sie einen Code ein. –

+0

Sie müssen genauer betrachten, wie Unicode dargestellt wird - es klingt, als ob Sie einige Annahmen über die Länge usw. haben. Wenn Bytes ankommen, müssen Sie genügend Informationen bereitstellen, um die Bytes in ein Unicode-Zeichen zu dekodieren. –

+0

Sie sollten wahrscheinlich UTF-8 verwenden, wenn die Dinge in jedem Fall über das Netzwerk gehen. –

Antwort

1

Ihre Freunde befinden sich hier:

WideCharToMultiByte, vorbei an der Codepage für UTF-8 als die MB-Codepage.

MultiByteToWideChar, dito.

0

Beispiel von here reposted:

#include <locale> 
#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std ; 

wstring widen(const string& str) 
{ 
    wostringstream wstm ; 
    const ctype<wchar_t>& ctfacet = 
         use_facet< ctype<wchar_t> >(wstm.getloc()) ; 
    for(size_t i=0 ; i<str.size() ; ++i) 
       wstm << ctfacet.widen(str[i]) ; 
    return wstm.str() ; 
} 

string narrow(const wstring& str) 
{ 
    ostringstream stm ; 
    const ctype<char>& ctfacet = 
         use_facet< ctype<char> >(stm.getloc()) ; 
    for(size_t i=0 ; i<str.size() ; ++i) 
        stm << ctfacet.narrow(str[i], 0) ; 
    return stm.str() ; 
} 

int main() 
{ 
    { 
    const char* cstr = "abcdefghijkl" ; 
    const wchar_t* wcstr = widen(cstr).c_str() ; 
    wcout << wcstr << L'\n' ; 
    } 
    { 
    const wchar_t* wcstr = L"mnopqrstuvwx" ; 
    const char* cstr = narrow(wcstr).c_str() ; 
    cout << cstr << '\n' ; 
    } 
} 
+0

Dies wird nicht UTF-8 verwenden, oder? – bmargulies

+0

Ich testete diese in einem einfachen cmd-Fenster und konvertiert hin und her zwischen wchar_t und char, aber ich frage mich auch, ob dies mit UTF-8 funktioniert? Gibt es eine Möglichkeit, es zu testen? – Sent1nel

Verwandte Themen