我正在尝试在PlainTextEdit控件中显示以UTF-8编码的中文字符,但它无法正确呈现它们。
我的数据来自数据库,我知道我在Qt中获得的字符串是正确的(字节与数据库中的字节相同)。一旦我在QString中有了中文字符,我尝试了各种各样的东西来显示它,但总是会产生问号或随机的ASCII字符:
QString chineseChar = query.value(fieldNo).toString(); // get the character
ui->plainTextEdit->appendPlainText(chineseChar); // doesn't work
ui->plainTextEdit->appendPlainText(chineseChar.toUtf8()); // doesn't work
ui->plainTextEdit->appendPlainText(QString::fromUtf8(chineseChar.toAscii()); // doesn't work
有关如何处理的任何建议吗?
答案 0 :(得分:1)
“我的数据来自数据库,我知道我在Qt中获得的字符串是正确的(字节与数据库中的字节相同)。”
你是怎么检查的?试试chineseChar.toUtf8()。toHex()。
一旦您的字符串数据在QString中,接受QString的所有UI元素都将正确处理它。通常,从纯文本数据(const char * / QByteArray)转换为QString时会发生错误。 这里的转换:
ui->plainTextEdit->appendPlainText(chineseChar.toUtf8()); // doesn't work
ui->plainTextEdit->appendPlainText(QString::fromUtf8(chineseChar.toAscii()); // doesn't work
将unicode字符串转换为bytearray,然后隐含地返回QString,因为这些方法需要QString。 我建议您定义QT_NO_CAST_FROM_ASCII和QT_NO_CAST_TO_ASCII以避免任何不需要的QByteArray< - > QString转换。
如果字符串错误,则在从QByteArray / const char *转换为QString时,即在query.value(fieldNo).toString()中,错误通常发生在之前。试试:
QString chineseChar = QString::fromUtf8( query.value(fieldNo).toByteArray() );
如果这没有帮助,问题出在QtSQL的某处,假设它从数据库接收的数据编码错误。