C++和C#之间Socket通信中文乱码

  • Post author:
  • Post category:其他


环境:C++ MFC框架,Visual Studio 2010 SP1,C#是Unity3D 5.3.1f1开发,都是Windows10 环境。

参考链接:

http://blog.csdn.net/yunffern/article/details/7850526



http://www.cppblog.com/sunraiing9/archive/2007/03/21/20281.html


问题:用的是UDP,C++端是客户端,Unity是服务端,客户端的设置是多字节(Use Multi-Byte Character Set),这就导致客户端在发送的UDP消息如果带有中文的话,服务端接收到的消息就会不全或有乱码。

解决办法:在C++发送前把多字节编码转成Unicode编码,C#在接收时,用Unicode编码。

部分代码如下,C++

这里sendto的第三个参数,是需要两倍的size,因为多字节用8bit来表示字符,Unicode用16bit来表示字符。

        char buffer[1024]="\0";
        strcpy(buffer, pDlg->m_strSendText);
        int nSize = pDlg->m_strSendText.GetLength();

        WCHAR bufU[1024] = L"\0";
        int bufUSize = MultiByteToWideChar(CP_ACP, 0, buffer, -1, bufU, 1024); 
        size_t tempsize = wcslen(bufU);


        if (sendto( pDlg->m_sockClt, (char *)bufU, bufUSize*2, 0, (struct sockaddr*)&server, len) != SOCKET_ERROR)
        {
            ......
        }

C#部分代码

    private void ReceiveData()
    {
        client = new UdpClient(port);
        while (true)
        {
            try
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = client.Receive(ref anyIP);
                string text = Encoding.Unicode.GetString(data);
            }
            catch (Exception err)
            {
                UnityEngine.Debug.LogError(err);
            }
        }
    }



版权声明:本文为a117653909原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。