我在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)
。
问候