Java 如何将QByteArray转换为QString?
以下是JAVA中的HttpServer,它将俄语字符串发送到Qt应用程序:Java 如何将QByteArray转换为QString?,java,c++,qt,encoding,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.send
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主窗口::响应(QNetworkReply*reply){
QByteArray data=reply->readAll();
//我也试过这个
//QString dataString=(QString)reply->readAll();
//QString数据行=(QString)reply->readLine();
//QString str=QString::fromUtf8(数据);
qDebug()
使用平台的默认字符集将该字符串编码为字节序列,并将结果存储到新的字节数组中
当此字符串无法在默认字符集中编码时,此方法的行为未指定。当需要对编码过程进行更多控制时,应使用CharsetEncoder
类
使用此方法序列化字符串是一个糟糕的想法;“平台默认编码”取决于当前的语言环境、操作系统等,而您需要定义良好的编码在应用程序之间传输数据
事实上,当你说“我什么都试过了,什么都没用”时,我相信你-这是因为您的字符串是在编码中编码的,这可能恰好是Windows计算机的默认8位编码。当您尝试在Qt端对其进行解码时(从Qt5开始,解码8位字符串时,默认情况下总是期望UTF-8),一切都会中断
首先,在Java方面,确保正确指定响应长度(必须提供正在写入的字节数,而不是源字符串中的字符数):
然后,在Qt端,您可以从QByteArray
构建QString
,指定它在UTF8中
QByteArray data = reply->readAll();
QString str = QString::fromUtf8(data);
(请注意,您也可以使用UTF-16或UTF-32发送字符串,但当然两边必须匹配;我选择UTF-8是因为它作为“在线”格式更常见,而且通常更紧凑)查看QString::fromUtf*方法组。除此之外,这个问题不是唯一的,并且在这里得到了不止一次的回答。我已经尝试了所有方法,没有任何效果。嘿,谢谢你的回答,我现在明白了,但是OutputStream os.write()不能接受Charset.forName(“UTF-8”).encode(响应)我尝试过使用通道,但它不起作用“can not accept”没有任何意义…您会遇到什么错误?您是否执行了导入java.nio.charset.charset;
?从UTF-8转换到UTF-8似乎有点奇怪,因为java和Qt都使用UTF-16编码。当然,我导入了该库。方法write(int)在类型OutputStream中不适用于参数(ByteBuffer)。我已尝试应用方法array():os.write(Charset.forName(“UTF-8”).encode(response.array());但我在Qt客户端中获得空字符串,或者您可以获得字节数组。很抱歉,我从未在Java中工作过,因此我的建议可能有点不合适。
public byte[] getBytes()
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();
QByteArray data = reply->readAll();
QString str = QString::fromUtf8(data);