从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);
c++
最新推荐文章于 2024-04-30 10:50:04 发布