8

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

在它最简单的格式中,这只是为一些特殊字符(如表情符号)分配了 2 个字符:

NSLog(@"Field '%@' contains %i chars", myTextBox.text, [myTextBox.text length] );

我尝试使用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 );
4

2 回答 2

12

返回 unichars的[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++;
}];

你应该去观看 2011 年 WWDC 的 Session 128 - Advance Text Processing。他们解释了为什么会这样。真的很棒!

我希望这对您有所帮助。
干杯!

于 2012-05-05T13:17:12.327 回答
0

我们也可以考虑以下选项作为解决方案

const char *cString = [myTextBox UTF8String];

int textLength = (int)strlen(cString);

这将适用于特殊字符和表情符号

于 2016-04-04T01:42:13.623 回答