(#゚Д゚)是一个5个字母的单词。但是在iOS中,[@“(#゚Д゚)”长度“是7.为什么?

时间:2013-02-18 03:23:34

标签: iphone ios nsstring uitextinput

(#゚Д゚)是一个5个字母的单词。但在iOS中,[@“(#゚Д゚)”长度为7。

  1. 为什么?

  2. 我正在使用<UITextInput>修改UITextFieldUITextView中的文字。当我创建一个5个字符长度的UITextRange时,它可以覆盖(#゚Д゚)。那么,为什么这个(#゚Д゚)在UITextFieldUITextView中看起来像一个5个字符的单词,但在NSString中看起来像一个7个字符的单词?

  3. 在这种情况下,如何获得正确的字符串长度?

2 个答案:

答案 0 :(得分:7)

1)正如评论中的许多人已经说过的那样,您的字符串由5个组合字符序列(或者您喜欢的字符簇)组成。按unichar分解为NSString的{​​{1}}方法时,您将得到一个7,它是在内存中表示字符串所需的length个数。

2)显然unicharUITextField正在以unichar精明的方式处理字符串。好消息,你也可以。见#3。

3)您可以使用一些正确处理组合字符序列的UITextView API来获取组合字符序列的数量。我非常快速地编写的一个简单示例是一个很小的NSString类别:

NSString

这又是快速代码;但它应该让你开始。如果您这样使用它:

@implementation NSString (ComposedCharacterSequences_helper)
-(NSUInteger)numberOfComposedCharacterSequences{
    __block NSUInteger count = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, self.length)
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
                              NSLog(@"%@",substring); // Just for fun
                              count++;
                          }];
    return count;
}
@end

你会看到你得到了理想的结果。

要对NSString *string = @"(# ゚Д゚)"; NSLog(@"string length %i", string.length); NSLog(@"composed character count %i", [string numberOfComposedCharacterSequences]); API进行深入说明,请查看NSString

答案 1 :(得分:1)

Д゚都由两个Unicode字符的character sequence表示(即使它们在视觉上呈现为一个)。 -[NSString length]报告Unicode字符的数量:

  

返回的数字包括组合的个别字符   字符序列,所以你不能使用这种方法来确定是否   字符串在打印时可见或显示多长时间

如果要查看字节表示:

#import <Foundation/Foundation.h>

NSString* describeUnicodeCharacters(NSString* str)
{
    NSMutableString* codePoints = [NSMutableString string];
    for(NSUInteger i = 0; i < [str length]; ++i){
        long ch = (long)[str characterAtIndex:i];
        [codePoints appendFormat:@"%0.4lX ", ch];
    }
    return codePoints;
}


int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSString *s = @" ゚Д゚";
        NSLog(@"%ld unicode chars. bytes: %@", 
            [s length], describeUnicodeCharacters(s));
    }
}

输出为:4 unicode chars. bytes: 0020 FF9F 0414 FF9F

2)和3):NJones所说的。