这是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并最终查看普通文本?
答案 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,因为它更常见的是“线上”格式和因为它通常更紧凑)