从服务端发送字符串给客户端,服务器端是阿里云的ubuntu系统(c++)来发送数据,客户端使用的是Qt来接收数据
服务器端代码:
string s="123abc你好";//要发送的字符串,包含汉字字母和数字
char*ss = new char[s.size()+1];
strcpy(ss,s.c_str()); //转换为char*
write(pinfo->fd,ss,len);
客户端代码:
connect(socket, &QTcpSocket::readyRead, [=]()
{
QByteArray recvMsg = socket->readAll();
qDebug()<<recvMsg;
});
打印结果如下图
可见字母和数字“123abc”编码没有乱码,汉字"你好"变成了16进制,而且数据长度似乎也不对
我感觉问题有两个
请问如何解决这两个问题
了解一下
TCP拆包解包
utf8编解码
我不太懂QT,只了解C++,姑且分析一下:
*
1是中文变成16进制乱码?-》不是乱码,是utf-8编码,三字节一个汉字,最后加'\0'
char *data = recvMsg.data(); //utf-8环境,看看data会不会还原为汉字。能不能打印正确,看shell环境是不是utf-8
*
2是数据长度不一致?
如果是char数组并不重要,由‘/0’截断。
1.客户端的环境应该是Windows,Windows使用gbk编码,服务端Ubuntu是utf-8编码,实际上开发中建议使用utf-8,所以打印乱码可以不去管他,你只需要了解utf-8到gbk编码互转即可。
2.长度问题有2种可能,1:TCP粘包。2:write调用是的len不对。
如果服务器端只发送一次,客户端接收一次就可以排除TCP粘包原因。
其次就是检查len是否被正确赋值(你代码截图中len没有定义和赋值,所以我只能猜测)。