你如何在Qt中使用unicode?

时间:2015-05-14 21:05:55

标签: c++ qt unicode encoding qt4

我想在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文件的编码并复制和粘贴符号,这不起作用。

1 个答案:

答案 0 :(得分:6)

您已经知道答案 - 将其指定为正确的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));