如何获取苹果表情符号的名称而非Unicode名称?

6

我发现表情符号的Unicode名称和在“字符查看器”中显示的苹果名称不同。如何使用Swift获取表情符号的苹果名称?

示例:

表情符号:

Unicode名称(通过.applyingTransform(.toUnicodeName, reverse: false)获得):

微笑的脸,张开嘴巴和眼睛

苹果名称(从macOS字符查看器中获取):

眯起眼睛的笑脸

2个回答

8
第一个是Unicode名称,尽管正确的名称是:
SMILING FACE WITH OPEN MOUTH AND SMILING EYES

事实上,它是大写的很重要。它是一个Unicode标识符。它是永久且独一无二的。(它真的是永久的,即使他们拼错了像“PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET”中的“BRAKCET”这样的单词,那个名称也会永远存在)。
第二个名称是“苹果名称”。这些是本地化名称。在Mac上,英文版本存储在:
/System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/Resources/en.lproj/AppleName.strings

您可以使用plutil将此文件转储,或使用PropertyListDecoder读取它。
$ plutil -p AppleName.strings
{
  "〰" => "wavy dash"
  "‼️" => "red double exclamation mark"
  "⁉️" => "red exclamation mark and question mark"
  "*️⃣" => "keycap asterisk"
  "#️⃣" => "number sign"
  "〽️" => "part alternation mark"
  "©" => "copyright sign"
  ...

除非你需要完全匹配苹果,否则我建议使用CLDR(通用语言环境数据存储库)注释的简称。这是本地化名称的Unicode源。尽管它们不保证唯一性,但它们最大的目的是支持文本转语音。
对于当前的XML列表,最方便的方式是在GitHub上查看。或者您可以浏览v37 table或下载raw data

2
使用Hoppper查看字符查看器应用程序,似乎没有相应的API,但您可以使用XCP服务获取它。
+[CPKDefaultDataSource localizedCharacterName:] 的伪代码如下:
/* @class CPKDefaultDataSource */
+(void *)localizedCharacterName:(void *)arg2 {
    r14 = arg2;
    rax = [CPKDefaultDataSource preferredEmojiLocale];
    if (rax != 0x0) {
            rax = CEMEmojiTokenCreateWithString(r14, rax);
            if (rax != 0x0) {
                    r15 = CEMEmojiTokenCopyName(rax, 0x2);
                    CFRelease(rax);
                    if (r15 != 0x0) {
                            rax = [r15 autorelease];
                    }
                    else {
                            rax = [[CPSearchManager sharedSearchManager] infoForCharcater:r14 infoTag:@"unam"];
                    }
            }
            else {
                    rax = [[CPSearchManager sharedSearchManager] infoForCharcater:r14 infoTag:@"unam"];
            }
    }
    else {
            rax = 0x0;
    }
    return rax;
}

-[CPSearchManager infoForCharcater:infoTag:] 的伪代码
/* @class CPSearchManager */
-(void *)infoForCharcater:(void *)arg2 infoTag:(void *)arg3 {
...
    rax = [CPCharacterDatabase sharedDatabase];
    rax = [rax createXPCDictionaryForCharacterInfo:r14];
...
    rax = [r12 cStringUsingEncoding:0x4];
    rax = xpc_dictionary_get_value(r15, rax);
...
    rax = xpc_dictionary_create(0x0, 0x0, 0x0);
    r12 = rax;
    xpc_dictionary_set_string(rax, "command", "search_character_info");
    xpc_dictionary_set_string(r12, "string", [r14 cStringUsingEncoding:0x4]);
    rdx = *(r15 + 0x10);
    *(r15 + 0x10) = rdx + 0x1;
    xpc_dictionary_set_uint64(r12, "transactionID", rdx + 0x1);
    rax = _CPXPCConnection();
    rax = xpc_connection_send_message_with_reply_sync(rax, r12);
    rax = xpc_dictionary_get_value(rax, "result");
...
}

我发现这一切都在这个框架内:/System/Library/PrivateFrameworks/CharacterPicker.framework。如果你正在为 macOS 构建此应用,可以链接到该库以进行私有分发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接