繁体   English   中英

客户端字符串编码java

[英]Client-side string encoding java

我和我的团队在解析从我们的服务器收到的字符串时遇到了这个令人讨厌的问题。 服务器是非常简单的插件,在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(...){...

客户端使用Java并且也是非常标准的套接字内容,这是我们在尝试许多不同方式解码来自服务器的响应之后的状态:

Socket s;
try {
    s = new Socket(URL, 1987);

    PrintWriter output = new PrintWriter(s.getOutputStream(), true);
    InputStreamReader inp = new InputStreamReader(s.getInputStream(), Charset.forName("UTF-8"));
    BufferedReader rd = new BufferedReader( inp );

    String st;
    while ((st = rd.readLine()) != null){
        System.out.println(st);
    }...

如果与服务器建立连接,它将发送一个字符串“Send Handshake”,其字符串的大小以字节为单位,在第一个代码块中看到。 这通知客户端它应该向服务器发送身份验证。 截至目前,我们从服务器获取的字符串如下所示: S e n d H a n dshake

我们使用了诸如字符串编码/解码工具之类的工具来尝试评估字符串的编码方式,但它在每个配置上都失败了。

我们不知道这是什么编码,如果有的话,或者如何解决它。 任何帮助将非常感激。

一目了然,在这里你将转换线QString参数为UTF8 QByteArray ,然后回QString似乎很奇怪:

QString text = response.toUtf8();

toUtf8()返回的QByteArray被赋值给text ,我认为假设QByteArray包含一个Ascii (char*)缓冲区。

我很确定QDataStream只能在Qt中使用。 它提供了一种与平台无关的序列化数据的方式,然后用于在其他地方使用另一个QDataStream进行反序列化。 正如您所注意到的,除了您的原始数据之外,它还包含许多额外的东西,并且在下一个Qt版本中额外的东西可能会发生变化。 (这就是为什么文档建议在你的流中包含正在使用的QDataStream的版本......所以它可以使用正确的反序列化逻辑。)

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

自Qt 1.0以来,QDataStream的二进制格式已经发展,并且可能会继续发展以反映Qt中所做的更改。 输入或输出复杂类型时,确保使用相同版本的流(version())进行读写非常重要。

如果你要使用其他语言,这是不切实际的。 如果它只是您传递的文本,请使用众所周知的传输机制(JSON,XML,ASCII文本,UTF-8等)并完全绕过QDataStream

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM