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文件的编码并复制和粘贴符号,这不起作用.
您已经知道答案 - 将其指定为正确的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)
| 归档时间: |
|
| 查看次数: |
2132 次 |
| 最近记录: |