QTextStream для печати как engli sh, так и Unicode 16 - PullRequest
0 голосов
/ 08 января 2020

У меня есть std :: string в linux, в котором есть как engli sh, так и китайский символ, когда я записываю его в файл, я могу написать только engli sh, и китайские символы появляются как неизвестный символ .

Как я могу напечатать английский и английский sh, используя QTextStream

Я использовал setCode c ("UTF-16"), но после этого все символы повреждены

  if( (lmxErr == lmx::elmx_error::ELMX_OK) && outFile.open( QFile::WriteOnly | QFile::Truncate ) ){
    QTextStream outStream( &outFile );
    outStream.setCodec("UTF-16");
    outStream << marshallingBuffer.c_str();
    outStream.flush();
   }

Ответы [ 2 ]

1 голос
/ 08 января 2020

Я думаю, вы должны сделать это

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 => 其
0 голосов
/ 08 января 2020

Мне очень жаль, что я не уверен в эффективности моего решения. Однако вы можете заменить outFile.open(QFile::WriteOnly | QFile::Truncate) на outFile.open(QIODevice::WriteOnly).

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...