繁体   English   中英

在Qt中,如何将Unicode代码点U + 1F64B转换为带有等效字符“🙋”的QString?

[英]In Qt, how do I convert the Unicode codepoint U+1F64B to a QString holding its equivalent character “🙋”?

背景:

我正在做一个散列,通过向它提供一个包含其字符的QString,您可以查找下面看到的描述。

角色图示例

我得到了相关数据的完整列表,看起来像这样:

QHash<QString, QString> lookupCharacterDescription;
...
lookupCharacterDescription.insert("003F","QUESTION MARK");
lookupCharacterDescription.insert("0040","COMMERCIAL AT");
lookupCharacterDescription.insert("0041","LATIN CAPITAL LETTER A");
lookupCharacterDescription.insert("0042","LATIN CAPITAL LETTER B");
...
lookupCharacterDescription.insert("1F648","SEE-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F649","HEAR-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F64A","SPEAK-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F64B","HAPPY PERSON RAISING ONE HAND");
...
lookupCharacterDescription.insert("FFFD","REPLACEMENT CHARACTER");
lookupCharacterDescription.insert("FFFE","<not a character>");
lookupCharacterDescription.insert("FFFF","<not a character>");
lookupCharacterDescription.insert("FFFFE","<not a character>");
lookupCharacterDescription.insert("FFFFF","<not a character>");

现在显然"1F64B"需要包装在这里。 我曾尝试将0x1F64B类的0x1F64B用作QChar,但老实说,我在黑暗中摸索着。 我可以使它使用像拉丁字母这样的较低值,但是它不能使用5个字符的地址。

问题:

  • 如何分类1F64B
  • 这被认为是UTF-32吗?
  • 我可以将这个值“ 1F64B”包裹起来以产生QString(“🙋”)吗?
  • 包装纸是否也适用于较低的价值?

当您使用QString(0x1F64B)它将调用QString::QString(QChar ch) 由于QChar是16位类型,因此它将值截断为0xF64B,并且由于该代码点当前未分配,您将获得无效字符。 我很确定您会在该行收到超范围警告。 您可以看到价值F64B在字符容易如果您在放大或使用十六进制编辑器。 由于0x1F64B无法容纳到单个16位QChar中,并且必须由代理对表示,因此无法以这种方式初始化字符串。

OTOH QString("🙋")可以正常工作,因为它是从另一个字符串构造字符串 您必须使用这样的字符串来构造字符串,或者通过分配UTF-8 / 16代码单元来手动构造该字符串。

这被认为是UTF-32吗?

不可以。UTF-32是Unicode编码,使用32位作为代码单位。 您只有QString而没有裸字节数组,因此您无需关心其基础编码(实际上是UTF-16)

我可以将这个值“ 1F64B”包裹起来以产生QString(“🙋”)吗?

您不应该将数字值当作字符串来处理。 而是将其存储为数字类型

QHash<qint32, QString> lookupCharacterDescription;
lookupCharacterDescription.insert(0x1F64B, "HAPPY PERSON RAISING ONE HAND");

然后使包含代码点0x1F64B处的字符的字符串使用

uint cp = 0x1F64B;
QString mystr = QString::fromUcs4(&cp, 1);

包装纸是否也适用于较低的价值?

是的,因为UCS4(也称为UTF-32)可以存储任何可能的Unicode字符

或者,您可以从UTF-16或UTF-8构造字符。 U + 1F64B在UTF-16中编码为D83D DE4B ,或者在UTF-8中编码为F0 9F 99 8B ,因此您可以使用以下任何一种

QChar utf16[2] = { 0xD38D, 0xDE4B };
str1 = QString(utf16, 2);
char* utf8[4] = { 0xF0, 0x9F, 0x99, 0x8B };
str2 = QString::fromUtf8(utf8, 4);

如果要在源代码中以原义形式包含字符串,则可以使用以下任一方法

str1 = QString::fromWCharArray(L"\xD83D\xDE4B");
str2 = QString::fromUtf8("\xF0\x9F\x99\x8B");

如果您具有C ++ 11支持,则只需分别对UTF-8,UTF-16和UTF-32使用前缀u8uU

u8"🙋"
u"🙋"
U"🙋"
u8"\U0001F64B"
u"\U0001F64B"
u"\uD83D\uDE4B"
U"\U0001F64B" 

理解文章和编码的强制性文章: 没有纯文本之类的东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM