我的应用程序在标签中使用“μ”符号,在Qt4中它显示正常,但在Qt 5中它没有相同的代码。我在Qt4中可以正常工作的两个不同地方使用以下两行:

QChar('μ').toLatin1()

QString::fromUtf8(rateText.toLatin1()));

在第二种情况下,字符串包含“μ”符号。

在我的主要main.cpp文件中,添加了以下代码:
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
#else
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
#endif

编辑:

这行在Qt 5中就足够了,因为Qt 5使用utf-8作为默认值
 ui->timeLabel->setText("Time = "+rateText);  //rateText contains 'μ' symbol

但这在Qt4中不起作用,即使这也不起作用
ui->timeLabel->setText("Time = "+rateText.toUtf8());

只有这对我有用:
ui->timeLabel->setText("Time = "+QString::fromUtf8(rateText.toLatin1()));

我需要一个适用于所有环境的解决方案

最佳答案

 QString::fromUtf8(rateText.toLatin1()));

这没有任何意义:您将字符串转换为latin1,只是将latin1字符串解释为UTF8。除非明确需要QByteArray/const char *,否则根本不应该进行此类转换。toLatin1()将微符号转换为0xb5,而UTF-8中的微符号将是0xc2b5

所以代替
 QString foo = QString::fromUtf8(rateText.toLatin1()));

做就是了
 QString foo = rateText;

如果需要转换为字节数组,请确保从转换为的相同编码转换回。
QByteArray ba = rateText.toUtf8();
... do stuff with ba
QString s = QString::fromUtf8(ba);

但是,应该只有少数情况需要这样做。

为了跟踪编码错误,我建议通过以下方式禁用任何隐式const char */QByteArray QString转换:
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

关于c++ - 特殊字符在Qt 5中无法正确显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20418197/

10-11 02:34