6

(# ゚Д゚) 是一个 5 个字母的单词。但在 iOS 中,[@"(# ゚Д゚)" 长度] 是 7。

  1. 为什么?

  2. <UITextInput>用来修改 aUITextField或中的文本UITextView。当我制作 5 个字符长度的 UITextRange 时,它​​可以覆盖 (# ゚Д゚) 。那么,为什么这个 (# ゚Д゚) 在 and 中看起来像一个 5 个字符的单词UITextFieldUITextView但在 NSString 中看起来像一个 7 个字符的单词???

  3. 在这种情况下,如何获得正确的字符串长度?

4

2 回答 2

7

1)正如评论中的许多人已经说过的那样,您的字符串由 5 个组合字符序列(如果您愿意,也可以是字符簇)组成。unichar当被s asNSStringlength方法分解时,你会得到一个 7 ,这是unichar在内存中表示你的字符串所需的 s 数。

2)显然UITextFieldandUITextView正在以 unichar 精明的方式处理字符串。好消息,你也可以。见#3。

3)您可以通过使用一些NSString正确处理组合字符序列的API来获取组合字符序列的数量。我很快就完成了一个简单的例子,它是一个小NSString类别:

@implementation NSString (ComposedCharacterSequences_helper)
-(NSUInteger)numberOfComposedCharacterSequences{
    __block NSUInteger count = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, self.length)
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
                              NSLog(@"%@",substring); // Just for fun
                              count++;
                          }];
    return count;
}
@end

这又是快速代码;但它应该让你开始。如果你像这样使用它:

NSString *string = @"(# ゚Д゚)";
NSLog(@"string length %i", string.length);
NSLog(@"composed character count %i", [string numberOfComposedCharacterSequences]);

你会看到你得到了想要的结果。

有关 API 的深入解释,NSString请查看WWDC 2012 Session 215 Video "Text and Linguistic Analysis"

于 2013-02-18T04:53:10.453 回答
1
于 2013-02-18T05:02:52.287 回答