Отправлять текстовые пакеты Unicode (win32) по сети с помощью winsock? - PullRequest
0 голосов
/ 19 ноября 2010

Я пытаюсь отправить текстовые пакеты по сети, используя winsock. Однако текст сохраняется как wchar_t, и мне нужно иметь возможность преобразовать текст в байтовый (char) формат для отправки по сети, который затем будет преобразован обратно в wchar_t.

Я экспериментировал с использованием ostringstream и преобразовал мою строку wchar_t в то, что выглядит как байтовый формат, однако, когда я пытаюсь вернуться назад, я получаю груз бреда.

Кажется, я не могу найти ответы во время поиска в Интернете, поэтому любая помощь будет высоко ценится.

Хорошо, вот код, с которым я играл.

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

Преобразовать в std :: string, чтобы получить формат символа.

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

Преобразовать обратно в std :: wstring, чтобы получить формат wchar_t ...

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Ваши друзья здесь:

WideCharToMultiByte, передавая кодовую страницу для UTF-8 в качестве кодовой страницы MB.

MultiByteToWideChar, то же самое.

0 голосов
/ 19 ноября 2010

Пример перепечатан с здесь :

#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' ;
  } 
}
...