c++ - Qt 5 中特殊字符无法正确显示

标签 c++ windows qt unicode

我的应用程序在标签中使用“μ”符号,在 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/

相关文章:

c++ - Xcode 9.4.1 中的 Apple Mach-O 链接器 (Id) 错误

c++ - Dynamic_cast 失败,即使我(据我所知)肯定是从一个正确派生的类中转换的。

C++ c2664 错误 "cannot convert argument 1 from std::string to _Elem *"

c - 获取将文档打印到 IPP 打印机的真实用户

c++ - Qt:QGraphicsScene::addText 内存泄漏?

C++11:字符串文字的类型是 "array of the appropriate number of const characters"

.net - Ruby 可以导入 .NET dll 吗?

c++ - 从 QTableWidget 行/单元格拖动在 Windows 中创建可放置文件链接

c++ - Qt 找不到服务 - "org.qt-project.qt.mediaplayer"

python - 刷新剧情 Chaco