Как я могу получить имя смайлика Apple вместо имени Unicode?

Я вижу, что имя смайлика в Unicode и его имя Apple, отображаемое в средстве просмотра символов, отличаются. Как я могу получить имя Apple для смайлика с помощью Swift?

Пример:

Эмодзи:

Имя Unicode (получено через .applyingTransform(.toUnicodeName, reverse: false)):

улыбающееся лицо с открытым ртом и улыбающимися глазами

Имя Apple (получено из программы просмотра персонажей macOS):

ухмыляющееся лицо с прищуренными глазами

0 ответов

Первое - это имя Unicode, хотя правильное имя:

SMILING FACE WITH OPEN MOUTH AND SMILING EYES

Тот факт, что это прописные буквы, имеет значение. Это идентификатор Unicode. Это постоянный и уникальный. (Это действительно навсегда, даже если они ошибаются в написании слова типа "BRAKCET" в "ФОРМЕ ПРЕЗЕНТАЦИИ ДЛЯ ВЕРТИКАЛЬНОГО ПРАВОГО БЕЛОГО ЛЕНТИКУЛЯРНОГО ТОРМОЗА", это имя навсегда).

Второе название - "Имя Apple". Это локализованные имена. На 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 (Common Locale Data Repository). Это источник Unicode для локализованных имен. Однако они не обещают быть уникальными. Их самая большая цель - поддержка преобразования текста в речь.

Для текущего списка в XML удобнее всего на GitHub. Или вы можете просмотреть таблицу v37 или загрузить необработанные данные.

Глядя на приложение Character Viewer с 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, вы можете связать эту библиотеку для частного распространения

Другие вопросы по тегам