NSString长度 - 特殊字符

Ral*_*roo 8 objective-c special-characters nsstring uitextfield

我有一个UITextField用户将输入字符.它很简单,我怎样才能返回它的实际长度?当字符串包含AZ 1-9个字符时,它按预期工作,但任何表情符号或特殊字符都会被重复计算.

在它最简单的格式中,对于某些特殊字符(如表情符号),它只有2个字符的分配:

NSLog(@"Field '%@' contains %i chars", myTextBox.text, [myTextBox.text length] );
Run Code Online (Sandbox Code Playgroud)

我已经通过每个字符尝试使用循环characterAtIndex,substringFromIndex等,毫无进展.

根据下面的答案,用于计算字符的确切代码(希望这是正确的方法,但它的工作..):

NSString *sString = txtBox.text;

__block int length = 0;
[sString enumerateSubstringsInRange:NSMakeRange(0, [sString length]) 
                        options:NSStringEnumerationByComposedCharacterSequences
                        usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {

                            length++;                                
                        }];

NSLog(@"Total: %u", length );
Run Code Online (Sandbox Code Playgroud)

hel*_*imi 12

[myTextBox.text length]返回单字符的数量,而不是字符串的长度可见.é = e+´这是2个unichars.表情符号字符应包含更多1个unichar.

下面的示例枚举字符串中的每个字符块.这意味着如果你记录substringRange它的范围可以超过1.

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

您应该去观看2011年WWDC会议128 - 高级文本处理.他们解释了为什么会这样.真的很棒!

我希望这对任何帮助都有帮助.
干杯!

  • 此方法不适用于某些表情符号字符,如标志.对于这些字符,您的方法将返回2. (2认同)