5

我看到一个表情符号的 Unicode 名称和它在 Character Viewer 中显示的 Apple 名称是不同的。如何使用 Swift 获得表情符号的 Apple 名称?

例子:

表情符号:

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

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

Apple 名称(来自 macOS Character Viewer):

眯着眼睛笑着的脸

4

2 回答 2

7

第一个是 Unicode 名称,但正确的名称是:

SMILING FACE WITH OPEN MOUTH AND SMILING EYES

它是大写的事实很重要。这是一个 Unicode 标识符。它是永久的,也是独一无二的。(它确实是永久性的,即使他们在“垂直右白色透镜状支架”中拼错了“BRAKCET”之类的词,这个名字也是永远的)。

第二个名字是“Apple Name”。这些是本地化名称。在 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"
  ...

也就是说,除非您绝对需要匹配 Apple,否则我建议您使用CLDR(通用区域设置数据存储库)注释短名称。这是本地化名称的 Unicode 源。不过,它们并没有被承诺是独一无二的。他们最大的目的是支持文本到语音。

对于 XML 中的当前列表,在GitHub 上最方便。或者您可以浏览v37 表或下载原始数据

于 2020-09-24T00:49:14.880 回答
2

查看带有Hoppper的 Character Viewer 应用程序,似乎没有用于此的 API,但您可以使用 XCP 服务获取它。

+[CPKDefaultDataSourcelocalizedCharacterName:] 的伪代码

/* @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:] 的 Presudocode

/* @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 构建它,你可以链接到这个库以进行私有分发

于 2020-09-24T00:25:37.533 回答