QTextStream,用于打印英语和Unicode 16



我在linux中具有std::string,它同时具有英文和中文字符,当我将其写入文件时,我只能写英文和中文字符作为未知字符出现。

如何使用QTextStream打印中英文

我使用了setCodec("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();
}

我认为你应该这样做

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 编解码器:

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 => 其

很抱歉,我不确定我的解决方案的有效性。但是,您可以将outFile.open(QFile::WriteOnly | QFile::Truncate)替换为outFile.open(QIODevice::WriteOnly)

问候

最新更新