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