Мне не удалось найти подобную проблему, поэтому здесь идет:
Я отправляю QString из QLocalSocket в QLocalServer через два приложения. Принимающее (QLocalServer) приложение действительно получает сообщение, но кажется, что кодировка совершенно неправильная.
Если я отправлю QString = «x» из QLocalSocket (клиент), я получу иностранный (китайский?) Символ в QLocalServer. Мой код буквально скопирован с Сайт Nokia для разработчиков
Если я распечатываю сообщение через QDebug, я получаю «??». Если я запускаю его в окне сообщения, печатаются китайские иероглифы. Я безуспешно пытался перекодировать полученное сообщение в UTF-8, Latin1 и т. Д.
Код выглядит следующим образом:
//Client
int main(int argc, char *argv[])
{
QLocalSocket * m_socket = new QLocalSocket();
m_socket->connectToServer("SomeServer");
if(m_socket->waitForConnected(1000))
{
//send a message to the server
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << "x";
out.device()->seek(0);
m_socket->write(block);
m_socket->flush();
QMessageBox box;
box.setText("mesage has been sent");
box.exec();
...
}
//Server - this is within a QMainWindow
void MainWindow::messageReceived()
{
QLocalSocket *clientConnection = m_pServer->nextPendingConnection();
while (clientConnection->bytesAvailable() < (int)sizeof(quint32))
clientConnection->waitForReadyRead();connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
QDataStream in(clientConnection);
in.setVersion(QDataStream::Qt_4_7);
if (clientConnection->bytesAvailable() < (int)sizeof(quint16)) {
return;
}
QString message;
in >> message;
QMessageBox box;
box.setText(QString(message));
box.exec();
}
Любая помощь высоко ценится.
Клиент сериализует const char*
в то время как сервер десериализует QString
, Это не совместимо. Первый буквально записывает байты строки, последний сначала кодирует в UTF-16. Итак, я предполагаю, что на стороне сервера необработанные строковые данные «fff» декодируются в QString, как если бы это были данные UTF-16 … возможно, в результате получается символ U + 6666, 晦.
Попробуйте изменить клиента, чтобы также сериализовать QString, т.е.
// client writes a QString
out << QString::fromLatin1("fff");
// server reads a QString
QString message;
in >> message;
Других решений пока нет …