我正在尝试使用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格式...
答案 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' ;
}
}