客户端字符串编码java

客户端字符串编码java,java,qt,sockets,encoding,Java,Qt,Sockets,Encoding,我和我的团队在解析从服务器收到的字符串时遇到了一个棘手的问题。服务器是在qt中完成的非常简单的套接字。下面是sendData函数: void sendData(QTcpSocket *client,QString response){ QString text = response.toUtf8(); QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out << (quint32)0; out

我和我的团队在解析从服务器收到的字符串时遇到了一个棘手的问题。服务器是在qt中完成的非常简单的套接字。下面是sendData函数:

void sendData(QTcpSocket *client,QString response){
QString text = response.toUtf8();
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out << (quint32)0;
out << text;
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
try{
    client->write(block);
}
catch(...){...
如果与服务器建立了连接,它将发送一个字符串发送握手,字符串的大小(以字节为单位)在它之前发送,如第一段代码所示。这会通知客户端它应该向服务器发送身份验证。到目前为止,我们从服务器获取的字符串如下所示: ������ ��������s��E��N��D�� ��H��A.��N��D��s��H��A.��K��e

我们使用了一些工具,例如尝试和评估字符串的编码方式,但在每个配置中都失败了

我们不知道这是什么编码,如果有的话,或者如何修复它。
任何帮助都将不胜感激

乍一看,将QString参数转换为Utf8 QByteArray然后再转换回QString的行似乎很奇怪:

QString text = response.toUtf8();

当toUtf8返回的QByteArray被分配给text时,我认为假设QByteArray包含一个Ascii字符*缓冲区。

乍一看,将QString参数转换为Utf8 QByteArray然后再转换回QString的行似乎很奇怪:

QString text = response.toUtf8();
当toUtf8返回的QByteArray被分配给text时,我认为假设QByteArray包含一个Ascii字符*缓冲区。

我非常确定QDataStream只用于Qt。它提供了一种与平台无关的序列化数据的方法,然后打算在其他地方用另一个QDataStream反序列化数据。正如您所注意到的,除了原始数据之外,它还包含许多额外的内容,这些额外的内容可能会在下一个Qt版本中发生更改。这就是为什么文档建议在流中包含正在使用的QDataStream版本。。。因此,它可以使用正确的反序列化逻辑

换句话说,您看到的额外内容可能是Qt中包含的元数据,并且不能保证与下一个Qt版本相同。从文档中:

QDataStream的二进制格式从Qt1.0开始就有了发展,很可能 继续发展以反映Qt中所做的更改。输入或 在输出复杂类型时,确保 流版本的同一版本用于读和写 写作

如果你要学习另一种语言,这是不实用的。如果您传递的只是文本,请使用众所周知的传输机制JSON、XML、ASCII文本、UTF-8等,并完全绕过QDataStream。

我非常确定QDataStream仅用于Qt。它提供了一种与平台无关的序列化数据的方法,然后打算在其他地方用另一个QDataStream反序列化数据。正如您所注意到的,除了原始数据之外,它还包含许多额外的内容,这些额外的内容可能会在下一个Qt版本中发生更改。这就是为什么文档建议在流中包含正在使用的QDataStream版本。。。因此,它可以使用正确的反序列化逻辑

换句话说,您看到的额外内容可能是Qt中包含的元数据,并且不能保证与下一个Qt版本相同。从文档中:

QDataStream的二进制格式从Qt1.0开始就有了发展,很可能 继续发展以反映Qt中所做的更改。输入或 在输出复杂类型时,确保 流版本的同一版本用于读和写 写作


如果你要学习另一种语言,这是不实用的。如果只是传递文本,请使用众所周知的传输机制JSON、XML、ASCII文本、UTF-8等,并完全绕过QDataStream。

这看起来像是编码问题。收到的字符串中有一条秘密消息。在任何情况下,请使用wireshark或tcpdump等工具查看线路上的数据,以消除猜测的需要:现在将查看这些工具,谢谢您的代码示例从不分配块。它应该有block=response.toUtf8吗?看起来像是编码问题。收到的字符串中有一条秘密消息。在任何情况下,请使用wireshark或tcpdump等工具查看线路上的数据,以消除猜测的需要:现在将查看这些工具,谢谢您的代码示例从不分配块。它应该有block=response.toUtf8吗?感谢您的帮助,我们解决了这个问题,它确实就是那一行。当我们将响应转换为UTF8时,我们试图将其存储在QString类型的变量中,这破坏了编码。一旦将文本变量的类型更改为QByteArray,它就会工作。QByteArray text=response.toUtf8;多亏了我们的帮助,我们解决了这个问题,确实是这一行。当我们将响应转换为UTF8时,我们试图将其存储在QString类型的变量中,这破坏了编码。将文本变量的类型更改为QByteAr后
雷:行了。QByteArray text=response.toUtf8;是的,您可能是对的,我们确实会将版本号与字符串一起发送,但为了简单起见,我们在调试时删除了它。我们将尝试使用它来解析字符串前面的垃圾/元数据。是的,您可能是对的,我们确实会将版本号与字符串一起发送,但为了简单起见,我们在调试时删除了它。我们将尝试使用它来解析字符串前面的垃圾/元数据。