【问题标题】:Convert emoji unicode to hex codepoint将emoji unicode转换为十六进制代码点
【发布时间】:2020-05-27 21:40:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios objective-c emoji


    【解决方案1】:

    您需要将uint32_t 更改为uint64_t

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

    【讨论】:

    • 不幸的是,这只会打印前 2 个代码点,而不是那些超过 2 个的表情符号,例如?‍♀️有5个
    【解决方案2】:
    - (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 参数表示。

    【讨论】:

      猜你喜欢
      • 2019-01-01
      • 2021-09-19
      • 2012-02-21
      • 2011-03-29
      • 2021-04-30
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多