当前位置:首页 » C语言&C++

解决C++客户端到C#服务器中文乱码

2011-05-06 18:25 本站整理 浏览(4040)
      这里我们将要讲的是解决C++在网络通信的过程中出现中文乱码的情况。出现中文乱码无非就是字符集的问题。这边主要讲解从c++客户端发信给 c# 服务器端出现中文乱码的解决方案。

  在VS2008环境下(ANSI),中文是两个字节,西欧字符是一个字节


  比如:你好tpzy,其实总共用了2*2 + 4*1个字节,如果原样发送出去,C#在解码的时候会出现问题


  如下是一个解决办法:(思路,将ANSI字符串转换成UNICODE字符串,然后在服务器端用UNICODE对字符串进行解码)


  代码如下:


  //编码函数,此处UNICODE字符串仍以char*呈现(强制转换)。


  //原因是send函数的缓冲区必须是char*型的


  char* DataSendRecvHandle::UnicodeEncoding(const char* src)


  {


  DWORD num= MultiByteToWideChar(CP_ACP,0,src,-1,NULL,0);


  WCHAR *wRetStr;


  wRetStr= (WCHAR*)malloc(num*sizeof(WCHAR));


  if(wRetStr == NULL)


  {


  return 0;


  }


  memset(wRetStr, 0, num*sizeof(WCHAR));


  MultiByteToWideChar(CP_ACP,0, src, -1, wRetStr, num);


  return (char*)wRetStr;


  }


  //下面是send函数的部分代码:


  //dataSend为一数据缓冲区,(注意:UNICODE每个字符占两个字节)


   char* dataSendFinal = UnicodeEncoding(dataSend);


  int dataLen = wcslen((WCHAR*)dataSendFinal);


  int nRecv = ::send(s, dataSendFinal, dataLen * 2 , 0);


  //呵呵,用到了强制类型转换,(我们用C++就是为了体验其对内存操作的方便)只要明白它们在内存是怎么回事情,是完全可以这样干的。


  如此,c#服务器端则可以这样解码:


  //得到一个用于读写网络数据的流


  //client:一个TCPClient


  NetworkStream stream = client.GetStream();


  //读取流中的网络数据


  byte[] bytes = new byte[256];


  Int32 readLen = stream.Read(bytes, 0, 256);


  String str = System.Text.Encoding.Unicode.GetString(bytes);


  //