Конвертировать эмодзи юникод в шестнадцатеричный код - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь получить шестнадцатеричный код для смайликов.

Код ниже успешно возвращает шестнадцатеричный код для смайликов без суррогатных пар (например, 1f58d для ?️):

NSData *data = [@"?️" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint32_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%x", unicode);

Однако для смайликов типа "??", имеющих кодовую точку "1f932-1f3ff" , приведенный выше метод возвращает только первую точку, "1f932" . Как я могу получить полную шестнадцатеричную кодовую точку для смайликов с несколькими кодовыми точками, пожалуйста (любой подход кода подходит)? (Обратите внимание, что некоторые смайлики, такие как «?‍♀️», имеют до 5 кодовых точек, например ?‍♀️)

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Вам нужно изменить uint32_t на uint64_t.

NSData *data = [@"??" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint64_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%llx", unicode);
1 голос
/ 21 февраля 2020
- (NSArray<NSNumber*>*) unicodeCodePoints:(NSString*)unicodeChar
{
    NSMutableArray* codePoints = [[NSMutableArray alloc] init];

    NSData* data = [unicodeChar dataUsingEncoding:NSUTF32LittleEndianStringEncoding];

    for ( NSUInteger i = 0; i < data.length / sizeof(UInt32); i++ )
    {
        UInt32* arr = (UInt32*)(data.bytes);

        [codePoints addObject:@(arr[i])];
    }

    return codePoints;
}

Тогда вы можете назвать это так:

for ( NSNumber* num in [self unicodeCodePoints:@"?‍♀️"] )
{
    NSLog(@"%0*x", (int)(2*sizeof(UInt32)), (UInt32)[num unsignedIntegerValue]);
}

Обратите внимание, это предполагает, что один символ Unicode представлен аргументом NSString.

...