我的应用程序在标签中使用“μ”符号,在Qt4中它显示正常,但在Qt 5中它不适用于相同的代码。我在两个不同的地方使用以下两行,它在Qt4中工作正常:
QChar('μ').toLatin1()
QString::fromUtf8(rateText.toLatin1()));
在第二种情况下,字符串包含“μ”符号。
在我的main 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()));
我需要一个可以解决的单一解决方案
答案 0 :(得分:3)
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