你如何在 Qt 中使用 unicode? [复制]
Posted
技术标签:
【中文标题】你如何在 Qt 中使用 unicode? [复制]【英文标题】:How do you use unicode in Qt? [duplicate] 【发布时间】:2015-05-14 21:05:55 【问题描述】:我想在 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 文件的编码并复制并粘贴符号,但没有成功。
【问题讨论】:
^ 这是一个类似的问题,但答案对我一点帮助都没有 由于您使用的是字符串文字,您是否尝试过使用QStringLiteral macro? 【参考方案1】:您已经知道答案 - 将其指定为正确的 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));
【讨论】:
以上是关于你如何在 Qt 中使用 unicode? [复制]的主要内容,如果未能解决你的问题,请参考以下文章