onlysomeone 发表于 2013-1-26 14:14:08

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;

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

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

  //

原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/97/12073597.shtml
页: [1]
查看完整版本: C++ 网络通信 中文乱码