【问题标题】:Number of characters in a string (not number of bytes)字符串中的字符数(不是字节数)
【发布时间】:2013-03-10 22:48:47
【问题描述】:

在objective-c 中的字符串中,如果我说[myStr length]; 之类的话,它会返回一个数字,即字节数,但我可以用什么来返回字符串中的字符数。

例如:
包含字母“a”的字符串返回长度为 1
其中包含单个表情符号的字符串返回长度为 2(有时甚至为 4)


这是因为那是字符串中的字节数……我只需要字符数。

【问题讨论】:

  • @valentinas 请重新阅读我的问题。我不认为你掌握了它。谢谢你的链接!但这不是我想要的。
  • «这是字节数» 不,正如文档所述,它是 Unicode 字符数。
  • @JoshCaswell 文档有误。
  • “字符”是指Unicode scalar value 还是代码点?
  • 不,不是。您似乎正在寻找渲染中 glyphs 的数量,即用户看到的东西。每个字形可以由几个 Unicode 字符表示。另请参阅:"Characters and Grapheme Clusters".

标签: objective-c string string-length glyph charactercount


【解决方案1】:

我刚刚推出了这个方法。将其添加到 NSString 类别。

- (NSUInteger)characterCount {
    NSUInteger cnt = 0;
    NSUInteger index = 0;
    while (index < self.length) {
        NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:index];
        cnt++;
        index += range.length;
    }

    return cnt;
}

NSString *a = @"Hello";
NSLog(@"%@ length = %u, chars = %u", a, a.length, a.characterCount);
NSString *b = @"? Emoji ?";
NSLog(@"%@ length = %u, chars = %u", b, b.length, b.characterCount);

这会产生:

你好长度 = 5,字符 = 5
? Emoji ? 长度 = 11,字符 = 9

【讨论】:

  • 难以置信! rmaddy,你总是让我印象深刻!哈哈! rangeOfComposedCharacterSequenceAtIndex 非常酷!
  • (有趣的注意,用标志表情符号试试这个,它不会工作。但那是因为标志表情符号实际上不是 unicode 字符,它们是 iOS 和 OSX 呈现为 1 的两个 unicode 字符字符并排放置时......并将“?*?”粘贴到文本区域(如对 SO 的评论),然后退格星号,看看会发生什么:o)
  • 如果您使用rangeOfComposedCharacterSequenceAtIndex: 方法来获取字符的长度,则处理退格应该可以工作。显然,这些标志字符仍然存在问题。
  • 这很酷。美国国旗符号由加框的 U 和加框的 S 字符组成。德国国旗符号来自加框的 D 和加框的 E 字符。聪明。
  • 我在Apple iOS dev forums上发布了一个问题。
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 2011-05-22
  • 2011-12-05
  • 2016-01-21
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多