(#゚Д゚)是一个5个字母的单词.但是在iOS中,[@"(#゚Д゚)"长度"是7.为什么?

YuA*_*uAo 6 iphone nsstring ios uitextinput

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

  1. 为什么?

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

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

NJo*_*nes 7

1)正如评论中的许多人已经说过的那样,你的字符串是由5个组成的字符序列(或者你喜欢的字符簇)组成的.当unichar按照NSStrings的length方法分解时,你会得到一个7,它是unichar在内存中表示你的字符串所需的s 数.

2)显然,UITextField并且UITextView正在以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
Run Code Online (Sandbox Code Playgroud)

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

NSString *string = @"(# ???)";
NSLog(@"string length %i", string.length);
NSLog(@"composed character count %i", [string numberOfComposedCharacterSequences]);
Run Code Online (Sandbox Code Playgroud)

你会看到你得到了理想的结果.

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