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

时间:2014-11-19 09:29:14

标签: ios objective-c unicode emoji

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

例如,hot beverage图标的unicode十六进制为U+2615(代码点9749),但zero digit的unicode十六进制为U+0030 U+20E3(代码点3154147)。 / p>

我正在使用此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

由于highlow unicodes,大多数表情符号的长度为2,因此在算法中有效,但数字的长度为3,而high unicode则没有匹配代理对的范围(0xd800 <= high && high <= 0xdbff)。

我找不到任何描述此类表情符号范围的文档。有没有办法处理这种类型的表情符号?

1 个答案:

答案 0 :(得分:2)

所引用的页面上所谓的“Keycap数字零表情符号”根本不是表情符号(虽然它可以像表情符号一样使用)但只是两个Unicode字符,通用数字0(U + 0030)和U + 20E3 COMBINING ENCLOSING KEYCAP,这是一个组合标记。

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

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