Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将QByteArray转换为QString?_Java_C++_Qt_Encoding - Fatal编程技术网

Java 如何将QByteArray转换为QString?

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

以下是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主窗口::响应(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);