我试图实现一种计算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中存在大量组合标记,并且存在无限数量的字符组合和组合标记(因为您可以连续使用组合标记).