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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值