ZBLOG

void tcpServer::startSendpaper(QByteArray json_data) { int chunkSize = 800; // 设置每个数据块的大小为 1024 字节 qDebug()

发送和接收数据出现乱码的原因通常与字符编码不匹配有关。你的代码中使用了 UTF-8 编码进行发送,但在接收端没有相应处理,或者在某些地方可能存在错误。下面是一些可能导致乱码的问题以及解决方法:

1. 确保一致的编码

确保发送和接收双方使用相同的字符编码。如果你在发送时使用 QTextCodec::codecForName("UTF-8"),那么接收时也需要确保以 UTF-8 编码进行解析。

2. 数据分片问题

你的代码将数据分成了多个块来发送,如果接收端没有正确处理这些分片,也可能会造成乱码。确保接收端能正确组装这些数据块。

3. 检查传输的数据内容

确认你要发送的数据确实是有效的 UTF-8 字符串。有时候,如果原始字符串不是 UTF-8 格式,转换为 QByteArray 后再通过网络传输就会出现问题。

4. 使用 QByteArray::fromRawData

如果你知道要传送的是二进制数据而不仅仅是文本,可以考虑直接将其作为字节流处理,而不要进行任何转换或编码,以避免潜在的乱码。

示例修改

以下是一些对你代码的改进建议:

  1. // 将整个 JSON 数据都视作字节数组,不用转换为 Unicode。
  2. for (it = ConnectClientInfo::GetSocketHash().constBegin(); it != ConnectClientInfo::GetSocketHash().constEnd(); ++it) {
  3. int bytesWritten = 0;
  4. while(bytesWritten < json_data.size()) {
  5. QByteArray chunk = json_data.mid(bytesWritten, chunkSize); // 不做编码转换
  6. QByteArray sendDataArray = SendData(vSendArrayHeardPaperData, chunk);
  7. int sizeWritten = send(it.key(), sendDataArray, sendDataArray.size(), 0);
  8. if (sizeWritten == -1) {
  9. qDebug() << "Error sending data to socket";
  10. break;
  11. }
  12. bytesWritten += sizeWritten; // 更新已发送字节数(注意这里去掉了 -10)
  13. }
  14. QByteArray sendDataArrayEnd = SendData(vSendArrayHeardPaperDataEnd,"");
  15. send(it.key(), sendDataArrayEnd, sendDataArrayEnd.size(), 0);
  16. }

接收方处理

对于接收部分,需要注意的是,当你读取到数据后,应确保将其正确地解码成字符串。如果你依然遇到问题,请检查接收到的数据是否完整,并确认拼接逻辑是否正确。

调试建议

  1. 在发送前打印出每个 chunk 的内容,并确保它们都是有效的 UTF-8。
  2. 在接收端,对每次读取的数据执行 qDebug() 打印,观察其真实内容及长度。
  3. 如果仍有乱码,可尝试使用其他编码方式(如 ISO-8859-1)进行测试,看是否仍然存在问题,从而缩小故障范围。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22401

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?