你如何在Qt中使用unicode?

Mat*_*der 0 c++ unicode encoding qt qt4

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

QLineEdit edit = new QLineEdit();
edit.setFont(QFont("Segoe UI Symbol"));
edit.setText(????);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过:

edit.setText(QString::fromUtf8("\U0001F50E"));
Run Code Online (Sandbox Code Playgroud)

哪给了编译器警告:

warning C4566: character represented by universal-character-name '\UD83DDD0E' cannot be represented in the current code page
Run Code Online (Sandbox Code Playgroud)

并显示为:??

我也尝试过:

edit.setText(QString("\U0001F50E"));
Run Code Online (Sandbox Code Playgroud)

哪给了编译器警告:

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

并且还给了:??

我尝试了你可以用QChar尝试的一切.我也尝试切换我的CPP文件的编码并复制和粘贴符号,这不起作用.

Rem*_*eau 6

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

上面的Unicode代码点U+FFFF使用代理对以UTF-16表示,代理对是两个16位代码单元,它们共同代表完整的Unicode代码点值.因为U+1F50E,代理对是U+D83D U+DD0E.

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

edit.setText(QString::fromWCharArray(L"\xD83D\xDD0E"));
Run Code Online (Sandbox Code Playgroud)

要么:

edit.setText(QString::fromStdWString(L"\xD83D\xDD0E"));
Run Code Online (Sandbox Code Playgroud)

假设平台sizeof(wchar_t)为2而不是4.

在您的示例中,您尝试使用QString::fromUtf8(),但是您为它提供了无效的UTF-8字符串.因为U+1F50E,它应该看起来像这样:

edit.setText(QString::fromUtf8("\xF0\x9F\x94\x8E"));
Run Code Online (Sandbox Code Playgroud)

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

uint cp = 0x1F50E;
edit.setText(QString::fromUcs4(&cp, 1));
Run Code Online (Sandbox Code Playgroud)