Я думаю, вы должны сделать это
outStream << QString::fromStdString( marshallingBuffer );
вместо
outStream << marshallingBuffer.c_str();
Давайте посмотрим, что там происходит. Скажем, у вас есть один символ CJK и сохраните его в std::string
с использованием литерала следующим образом:
std::string text = "其";
Если вы проверите размер строки, неожиданно:
qDebug() << text.size(); //3 bytes
Редактор utf-8 закодировал символ в трех байтах, все они хранятся в строке. Давайте посмотрим на них:
qDebug() << QByteArray(text.c_str(), text.size()).toHex(); //e585b6
Теперь в поток, используя 16-битный код Unicode c:
QByteArray bytes;
QTextStream stream(&bytes, QIODevice::WriteOnly);
stream.setCodec("UTF-16");
stream << text.c_str();
stream.flush();
qDebug() << bytes.toHex(); //e5008500b600
Вы можете видеть, что каждый байт в исходной строке был перекодируется в 16-битный символ Unicode, таким образом заканчиваясь тремя непечатаемыми символами.
Преобразование в QString
исправит ситуацию:
QString unicode = QString::fromStdString(text);
qDebug() << unicode.size(); //1 character, 2 bytes wide
это может быть выведено в поток:
QByteArray bytes;
QTextStream stream(&bytes, QIODevice::WriteOnly);
stream.setCodec("UTF-16");
stream << unicode;
stream.flush();
qDebug() << bytes.toHex(); //7651 => U+5176 => 其