NSString长度 - 特殊字符

时间:2012-05-05 12:21:04

标签: objective-c nsstring uitextfield special-characters

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

这是最简单的格式,对于像表情符号这样的特殊字符,只需要分配2个字符:

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

我已经尝试使用characterAtIndexsubstringFromIndex等循环遍历每个角色,并且无处可去。

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

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 );

2 个答案:

答案 0 :(得分:12)

[myTextBox.text length]返回unichars的计数,而不是字符串的可见长度。 é = 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会议128 - 高级文本处理。他们解释了为什么会这样。真的很棒!

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

答案 1 :(得分:0)

我们还可以将以下选项视为解决方案

const char *cString = [myTextBox UTF8String];

int textLength = (int)strlen(cString);

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