你如何在 Qt 中使用 unicode?

How do you use unicode in Qt?

我想在 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 文件的编码并复制并粘贴符号,但没有用。

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

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

在Qt中,一个UTF-16代码单元表示为一个QChar,所以你需要两个QChar值,eg:

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));