在 Qt 中显示 UTF-16 笑脸

Kha*_*ran 0 qt utf-16

请帮助我在 Qt 中显示来自字符串“\uD83D\uDE03”的UTF-16 表情符号张开嘴的微笑的脸qDebug()”(也许使用或来QLabel显示它)。

我有:

QString a = "\\uD83D\\uDE03";
Run Code Online (Sandbox Code Playgroud)

我想将其打印到 my 中qDebug,我期望的结果是 . 我不知道该怎么做。

Mar*_*k R 5

看到评论后(我已将其移至问题):

我有 QString a = "\uD83D\uDE03"; 我想将其打印到我的 qDebug 中,我期望的结果是 。我不知道该怎么做。

我明白问题出在哪里了。字符串编码以及不同类型字符串编码之间的转换。

当你有这种文字“\uD83D\uDE03”(让它无效)时,你必须使用可以使用单字节作为字符的编码。例如 UTF-8。然后你必须进行QString内部使用 UTF-16 的转换。

修复它(在 Qt 5 中):

QString smile = QString::fromUtf8("\xF0\x9F\x98\x83");
Run Code Online (Sandbox Code Playgroud)

在 Qt 4 中,情况稍微复杂一些:

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString smile = QTextDecoder(codec).toUnicode("\xF0\x9F\x98\x83", 4);
Run Code Online (Sandbox Code Playgroud)

另一种方法使用QChar并且它有很好的文档记录(适用于 Qt4 和 Qt5),这里是文档中示例的调整:

static const QChar unicodeSmile[] = { 0xD83D, 0xDE03, 0 };
QString smile = QString::fromRawData(unicodeSmile);
Run Code Online (Sandbox Code Playgroud)

请注意,也有wchar,但这非常依赖于平台,因此可能会产生更多问题(这就是 Qt 提供QChar *方法的原因)。