带有标志表情符号的 NSString 长度

NSString length with flag emojis

我正在尝试获取包含一堆表情符号(包括标志字符)的 NSString 的长度。现在我知道如何获取包含表情符号的字符串的长度:

__block NSInteger length = 0;
[string enumerateSubstringsInRange:range
                           options:NSStringEnumerationByComposedCharacterSequences
                        usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    length++;
}];

但是,"NSStringEnumerationByComposedCharacterSequences" 在这种情况下不起作用。正常的表情符号由两个字符组合而成。国旗表情符号由两个类似表情符号的字符组合在一起。因此,在没有任何枚举技术的情况下,一个旗帜表情符号的长度是 4。

如何获得包含标志表情符号的 NSString 的正确长度(字符数)?

我尝试了以下解决方案。 对于普通表情符号,它是 returns 2,对于旗帜,它会给出 4。 这也适用于普通字符和特殊字符。

const char *cString = [string UTF8String];

int textLength = (int)strlen(cString);

我强烈建议你阅读 This Article by Ole Begemann,它解释了 NSString/Unicode/Encoding,单独讨论了一些关于 NSString 长度计数、比较等的陷阱

根据这篇文章:

您可以使用:

[text lengthOfBytesUsingEncoding:NSUTF32StringEncoding] / 4