Looking at the Character Viewer app with Hoppper, it seems that there is no API for this, but you could get it using a XCP service.
Pseudocode for +[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;
}
Presudocode of -[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");
...
}
I found all this inside this framework: /System/Library/PrivateFrameworks/CharacterPicker.framework
, if you are building this for macOS, you can link against this library for private distribution