【问题标题】:Some emojis has a length of 3? (digits)一些表情符号的长度为 3? (数字)
【发布时间】:2015-01-16 18:09:39
【问题描述】:

我正在尝试实现一种计算NSString 中表情符号数量的方法。我找到了一种适用于大多数表情符号的方法,但我正在为一些表情符号苦苦挣扎,这些表情符号的定义似乎与其他表情符号不同。

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

我正在使用这个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 &lt;= high &amp;&amp; high &lt;= 0xdbff)。

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

【问题讨论】:

    标签: ios objective-c unicode emoji


    【解决方案1】:

    引用页面上所谓的“键帽数字零表情符号”根本不是表情符号(尽管它可以以类似表情符号的方式使用),而只是两个 Unicode 字符,常见的数字 0 (U+0030)和U+20E3 COMBINING ENCLOSING KEYCAP,这是一个组合标记。

    像 U+20E3 这样的组合标记可以用在任何字符之后,以生成键帽 0、0⃣ 或键帽 $、$⃣ 等符号(如您所见,由于字体的原因,这些符号在所有情况下都无法完美运行问题)。

    这样的组合是两个字符,因为“字符”的技术含义是作为编码字符集的一个元素。如果你想把它算作一个符号,你需要自己定义和实现这个逻辑。注意,Unicode 中有大量的组合标记,而字符和组合标记的组合是无限的(因为可以连续使用组合标记)。

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2021-12-03
      • 2014-02-18
      • 1970-01-01
      • 2022-07-23
      • 2016-01-12
      相关资源
      最近更新 更多