【问题标题】:NSString length with flag emojis带有标志表情符号的 NSString 长度
【发布时间】:2015-09-03 01:37:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • NSInteger length = [string length]; 有什么问题?您可以使用substringWithRange 来获取您感兴趣的范围。
  • @Alex 请注意,当您说标志字符的长度为 4 时,即 4 个 UTF-16 代码单元或 8 个字节。
  • @i_am_jorf @"????????".length 返回 4,这是您对一个字符的期望吗? @" -s????????????????-" 中标志字符的范围是多少?你认为范围是 NSMakeRange(5, 4) 吗?
  • 啊,我明白了。我提到范围是因为我看到您正在将范围传递给上述范围。我不确定答案,但是您的示例使您的问题更加清楚。
  • Foundation 中的 Unicode 完全被破坏了。一年前,斯威夫特也是如此,但至少他们对长度是诚实的。在 Swift 2.0 中统一是固定的,雅虎!所以,请大家 bugreport 并要求 Apple 将 eSwift unicode 更改为 NSString。

标签: ios objective-c nsstring emoji


【解决方案1】:

我尝试了以下解决方案。 对于普通的表情符号,它返回 2,对于标志,它将返回 4。 这也适用于普通字符和特殊字符。

const char *cString = [string UTF8String];

int textLength = (int)strlen(cString);

【讨论】:

    【解决方案2】:

    我强烈建议您阅读Ole Begemann 撰写的This Article,其中解释了 NSString/Unicode/Encoding,并讨论了一些关于 NSString 长度计数、比较等的陷阱。

    根据这篇文章:

    你可以使用:

    [text lengthOfBytesUsingEncoding:NSUTF32StringEncoding] / 4
    

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 2023-03-04
      • 1970-01-01
      • 2017-03-14
      • 2021-12-03
      • 1970-01-01
      • 2019-01-10
      • 2021-10-11
      • 2019-06-19
      相关资源
      最近更新 更多