NSString长度 - 特殊字符

8

我有一个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个回答

12

[myTextBox.text length] 返回的是字符串中 unichar 的数量,而不是可见长度。 é=e+´ 是 2 个 unichar。 Emoji 字符应该包含多于 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场会议 - "Advance Text Processing"。他们解释了为什么是这样的。真的很棒!

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


非常非常感谢。稍加调整后,我终于让它正常运行了!已经更新并接受为答案(如果我做错了什么,请告诉我!)。我会把那个视频加入我的观看列表,有一些我真的需要完善的东西... 再次感谢。 - Ralpharoo
2
该方法无法处理一些表情符号,例如国旗。对于这些字符,您的方法将返回2。 - Swordsfrog

0
我们也可以考虑以下选项作为解决方案。
const char *cString = [myTextBox UTF8String];

int textLength = (int)strlen(cString);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接