使用winsock通过网络发送Unicode(win32)文本包?

时间:2010-11-19 02:03:18

标签: c++ winapi winsock

我正在尝试使用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以获取char格式。

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

转换回std :: wstring以获取wchar_t格式...

2 个答案:

答案 0 :(得分:1)

你们这里的朋友是:

WideCharToMultiByte,将UTF-8的代码页作为MB代码页传递。

MultiByteToWideChar,同上。

答案 1 :(得分:0)

here重新发布的示例:

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