2012-05-05 92 views
8

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

在它的最简单的形式,这只是有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); 

回答

12

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

下面的示例枚举了字符串中的每个字符块。其中,如果您登录的substringRange的范围内它可以超过1

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

你应该去看会话128意味着 - 从2011年的WWDC提前文本处理。他们解释了为什么它是这样的。这真的太棒了!

我希望这是对任何帮助。
干杯!

+0

感谢非常非常努力。经过一些调整让它工作!已经更新并被接受为答案(如果我做错了,请告诉我!)。将该视频添加到我的观察列表中,有几件事情我真的需要打磨...再次感谢 – Ralphonzo

+2

此方法不适用于某些表情符号字符,如标志。你的方法将返回2这些字符。 – Swordsfrog

+0

救命恩,谢谢! – beebcon

0

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

const char *cString = [myTextBox UTF8String]; 

int textLength = (int)strlen(cString); 

这将特殊字符和表情符号

+0

抱歉,这不适用于表情符号 – cornr