簡體   English   中英

我怎樣才能獲得 Apple 表情符號名稱而不是 Unicode 名稱?

[英]How could I get Apple emoji name instead of Unicode name?

我看到表情符號的 Unicode 名稱和字符查看器中顯示的 Apple 名稱不同。 如何使用 Swift 獲得表情符號的 Apple 名稱?

例子:

表情符號:

Unicode 名稱(通過.applyingTransform(.toUnicodeName, reverse: false)獲得):

張開嘴和微笑的眼睛的笑臉

Apple 名稱(來自 macOS Character Viewer):

眯着眼睛笑着的臉

第一個是 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 表或下載原始數據

查看帶有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 構建它,你可以鏈接到這個庫以進行私有分發

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM