将表情符号 unicode 转换为十六进制代码点

Convert emoji unicode to hex codepoint

我正在尝试获取表情符号的十六进制代码点。

下面的代码成功 returns 没有代理对的表情符号的十六进制代码点(例如 1f58d for ️):

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

然而,对于像“”这样的表情符号,其代码点为 “1f932-1f3ff”,上述方法仅 returns 第一个点,” 1f932。请问如何获得具有多个代码点的表情符号的完整十六进制代码点(任何代码方法都可以)? (请注意,某些表情符号,如“‍♀️”最多有 5 个代码点,例如 ‍♀️)

您需要将 uint32_t 更改为 uint64_t

NSData *data = [@"" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint64_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%llx", unicode);
- (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 参数表示。