你如何在 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));
我想在 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));