如何将QByteArray转换为QString?

How to convert QByteArray to QString?

本文关键字:QString 转换 QByteArray      更新时间:2023-10-16

这是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);
} 

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

"\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">

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

getBytes

public byte[] getBytes()

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

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

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

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


首先,在 Java 端用 UTF8 对字符串进行编码,确保正确指定响应长度(您必须提供正在写入的字节数,而不是源字符串中的字符数):

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端,你可以从QByteArray构建一个QString,指定它是UTF8。

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

(请注意,您也可以以 UTF-16 或 UTF-32 发送字符串,但当然两边必须匹配;我选择 UTF-8 是因为它作为"在线"格式更常见,而且它通常更紧凑)