你如何在 Qt 中使用 unicode? [复制]

Posted

技术标签:

【中文标题】你如何在 Qt 中使用 unicode? [复制]【英文标题】:How do you use unicode in Qt? [duplicate] 【发布时间】:2015-05-14 21:05:55 【问题描述】:

我想在 QLineEdit 字段中使用放大镜 (U+1F50E) Unicode 符号。 我想出了如何使用 QChar 使用 16 位 unicode 符号,但是我不知道如何使用由 5 个十六进制数字表示的 unicode 符号。

QLineEdit edit = new QLineEdit();
edit.setFont(QFont("Segoe UI Symbol"));
edit.setText(????);

到目前为止我已经尝试过:

edit.setText(QString::fromUtf8("\U0001F50E"));

这给了编译器警告:

warning C4566: character represented by universal-character-name '\UD83DDD0E' cannot be represented in the current code page

并显示为:??

我也试过了:

edit.setText(QString("\U0001F50E"));

这给了编译器警告:

warning C4566: character represented by universal-character-name '\UD83DDD0E' cannot be represented in the current code page (1252)

还给了:??

我尝试了所有可以尝试使用 QChar 的方法。我还尝试切换我的 CPP 文件的编码并复制并粘贴符号,但没有成功。

【问题讨论】:

^ 这是一个类似的问题,但答案对我一点帮助都没有 由于您使用的是字符串文字,您是否尝试过使用QStringLiteral macro? 【参考方案1】:

您已经知道答案 - 将其指定为正确的 UTF-16 字符串。

U+FFFF 以上的 Unicode 代码点在 UTF-16 中使用 代理对 表示,这是两个 16 位代码单元共同作用以表示完整的 Unicode 代码点值。对于U+1F50E,代理对是U+D83D U+DD0E

在 Qt 中,一个 UTF-16 代码单元表示为一个 QChar,因此您需要两个 QChar 值,例如:

edit.setText(QString::fromWCharArray(L"\xD83D\xDD0E"));

或:

edit.setText(QString::fromStdWString(L"\xD83D\xDD0E"));

假设sizeof(wchar_t) 是 2 而不是 4 的平台。

在您的示例中,您尝试使用 QString::fromUtf8(),但您给了它一个无效的 UTF-8 字符串。对于U+1F50E,它应该是这样的:

edit.setText(QString::fromUtf8("\xF0\x9F\x94\x8E"));

您也可以改用QString::fromUcs4()

uint cp = 0x1F50E;
edit.setText(QString::fromUcs4(&cp, 1));

【讨论】:

以上是关于你如何在 Qt 中使用 unicode? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中将字符与 unicode 进行比较

Qt - 如何将 Qt 运行时 DLL 复制到输出路径

使用 sudo 权限的 Qt 复制文件

如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串? [复制]

QT unicode编码问题

编码(ACSII unicod UTF-8)QT输出中文乱码深入分析