我正在尝试实现一种计算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
由于high
和low
unicodes,大多数表情符号的长度为2,因此在算法中有效,但数字的长度为3,而high
unicode则没有匹配代理对的范围(0xd800 <= high && high <= 0xdbff
)。
我找不到任何描述此类表情符号范围的文档。有没有办法处理这种类型的表情符号?
答案 0 :(得分:2)
所引用的页面上所谓的“Keycap数字零表情符号”根本不是表情符号(虽然它可以像表情符号一样使用)但只是两个Unicode字符,通用数字0(U + 0030)和U + 20E3 COMBINING ENCLOSING KEYCAP,这是一个组合标记。
可以在任何字符之后使用像U + 20E3这样的组合标记来生成像键帽0,0,或键帽$,$ symbols这样的符号(正如您所看到的,由于字体的原因,这些符号在所有上下文中都无法完美地工作问题)。
这种组合是两个字符,用于“字符”作为编码字符集的元素的技术含义。如果要将其计为一个符号,则需要自己定义和实现逻辑。请注意,Unicode中存在大量组合标记,并且存在无限数量的字符组合和组合标记(因为您可以连续使用组合标记)。