代码之家  ›  专栏  ›  技术社区  ›  Anon

在Qt中,如何将Unicode码点U+1F64B转换为包含其等效字符“”的QString?

  •  0
  • Anon  · 技术社区  · 6 年前

    我正在做一个散列,它将允许您通过输入一个包含其字符的QString来查找下面的描述。

    Character map example

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

    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 但我真的在黑暗中摸索。我可以让它与较低的值,如拉丁字母,但它失败的5个字符的地址。

    问题:

    • 如何分类 1F64B ?
    • 这算是UTF-32吗?
    • 我可以用什么包装这个值“1F64B”来生成QString(“”)?
    • 包装是否也适用于较低的值?
    1 回复  |  直到 6 年前
        1
  •  5
  •   phuclv    6 年前

    QString(0x1F64B) QString::QString(QChar ch) . 自 QChar 是16位类型,它将 截断 F64B 在角色中很容易  如果放大或使用十六进制编辑器。由于0x1F64B无法装入单个16位QChar,并且必须由代理项对表示,因此不能以这种方式初始化字符串。

    奥托 QString("🙋") 因为它在构造字符串 从另一个字符串 . 您必须用这样的字符串来构造字符串,或者手动分配UTF-8/16代码单元。

    不是。UTF-32是一种Unicode编码,使用32位作为代码单位。您只有QString而没有空字节数组,因此不需要关心它的底层编码(实际上是UTF-16)

    我可以用什么包装这个值“1F64B”来生成QString(“”)?

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

    然后使用

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

    D83D DE4B ,或作为 F0 9F 99 8B 因此,在UTF-8中,您可以使用以下任何一种

    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的支持,那么只需使用前缀 u8 , u U

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

    理解文本和编码的强制性条款: There Ain't No Such Thing as Plain Text

    推荐文章