ios – 有些表情符号长度为3? (数字)

我试图实现一种计算NSString中表情符号数量的方法.我找到了一种适用于大多数表情符号的方法,但我正在努力学习一些表情符号,这似乎是以与其他人不同的方式定义的.

例如,hot beverage图标具有U 2615(代码点9749)的unicode十六进制,但zero digit具有U 0030 U 20E3(代码点3154147)的unicode十六进制.

我正在使用此NSString类别来确定表情符号的数量:

@implementation NSString (Emojis)

- (BOOL)isEmoji
{
    const unichar high = [self characterAtIndex: 0];

    // Surrogate pair (U+1D000-1F77F)
    if (0xd800 <= high && high <= 0xdbff)
    {
        const unichar low = [self characterAtIndex: 1];
        const int codepoint = ((high - 0xd800) * 0x400) + (low - 0xdc00) + 0x10000;

        return (0x1d000 <= codepoint && codepoint <= 0x1f77f);
    }
    else // Not surrogate pair (U+2100-27BF)
    {
        return (0x2100 <= high && high <= 0x27bf);
    }
}

- (NSUInteger)numbersOfEmojis
{
    NSUInteger __block emojiCount = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, [self length])
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
                              if ([substring isEmoji])
                              {
                                  emojiCount++;
                              }
                          }];

    return emojiCount;
}
@end

由于高和低的unicode,大多数表情符号的长度为2,在算法中有效,但数字的长度为3,高的unicode与代理对的范围不匹配(0xd800 <= high& & high< = 0xdbff). 我找不到任何描述此类表情符号范围的文档.有没有办法处理这种类型的表情符号?

最佳答案 所引用的页面上所谓的“键帽数字零表情符号”根本不是表情符号(虽然它可以以表情符号的方式使用),而只是两个Unicode字符,通用数字0(U 0030)和U 20E3 COMBINING包含KEYCAP,这是一个组合标记.

可以在任何字符之后使用像U 20E3这样的组合标记来生成像键帽0,0,或键帽$,$symbols这样的符号(如您所见,由于字体问题,这些符号在所有上下文中都不能完美地工作).

这种组合是两个字符,用于“字符”作为编码字符集的元素的技术含义.如果要将其计为一个符号,则需要自己定义和实现逻辑.请注意,Unicode中存在大量组合标记,并且存在无限数量的字符组合和组合标记(因为您可以连续使用组合标记).

点赞