如何将QByteArray转换为QString?

时间:2017-04-05 21:30:41

标签: java c++ qt encoding

这是JAVA中的HttpServer,它将俄语字符串发送到Qt应用程序:

 public void handle(HttpExchange t) throws IOException {
        //Response from server in Russian
        String response = "Ответ от сервера на русском языке"; //"Response from server in Russian"
        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        //os.write(response.getBytes());
       //right now I am trying this code
      os.write(response.getBytes(Charset.forName("UTF-8"))); //and UTF-16
       //also I have tried this
        os.write(Charset.forName("UTF-16").encode(response).array());

        os.close();
    }

Qt中的应用程序从服务器获得响应(俄语文本)

 void MainWindow::Response(QNetworkReply *reply) {
    QByteArray data = reply->readAll();
   // Also I've tried this
   // QString dataString = (QString)reply->readAll();
   // QString dataLine = (QString)reply->readLine();
   // QString str=  QString::fromUtf8(data);
    qDebug() << "data from server: " << data;
     label->setText(str);
} 

我只想在控制台或标签组件中显示正常字符串,但我有 空字符串或字节数组或问号序列

&#34; \ xCE \ xF2 \ xE2 \ xE5 \ xF2 \ xEE \ xF2 \ xF1 \ xE5 \ xF0 \ xE2 \ xE5 \ xF0 \ xE0 \ xED \ xE0 \ xF0 \ xF3 \ xF1 \ xF1 \ xEA \ xEE \ xEC \ xFF \ xE7 \ xFB \ xEA \ xE5&#34;

如何通过编码解决此问题并将此数组转换为QString并最终查看普通文本?

1 个答案:

答案 0 :(得分:1)

  

getBytes

public byte[] getBytes()
     

使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。

     

未指定此字符串无法在默认字符集中进行编码时此方法的行为。当需要更多地控制编码过程时,应该使用CharsetEncoder类。

使用此方法序列化字符串是一个可怕的想法; “平台默认编码”取决于当前的语言环境,操作系统等等,而您希望定义良好的编码在应用程序之间传输数据。

事实上,我相信你,当你说“我已经尝试了一切,没有任何作用” - 这是因为你的字符串是用windows-1251编码编码的,这可能恰好是默认的8位编码你的Windows机器。当你尝试在Qt端解码时 - 从Qt5开始,在解码8位字符串时,默认情况下总是需要UTF-8,一切都会中断。

首先,在Java端encode your string in UTF8上,确保正确指定响应长度(您必须提供正在编写的 bytes 的数量,而不是源字符串):

String response = "Ответ от сервера на русском языке"; //"Response from server in Russian"
byte[] response_data = response.getBytes("UTF-8");
t.sendResponseHeaders(200, response_data.length());
OutputStream os = t.getResponseBody();
os.write(response_data);
os.close();

然后,在Qt方面,您可以从QString构建QByteArray,并以UTF8指定它。

QByteArray data = reply->readAll();
QString str = QString::fromUtf8(data);

(请注意,你也可以用UTF-16或UTF-32发送你的字符串,但当然双方必须匹配;我选择了UTF-8,因为它更常见的是“线上”格式和因为它通常更紧凑)