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

Iphone (#和#xFF9F;Д;゚;)是一个5个字母的单词。但在iOS中,[“长度”是7。为什么?,iphone,ios,nsstring,uitextinput,Iphone,Ios,Nsstring,Uitextinput,(#゚Д゚) 是一个5个字母的单词。但在iOS中,[@”(#゚Д゚)" 长度]为7 为什么? 我正在使用修改UITextField或UITextView中的文本。当我将uitextange设置为5个字符长度时,它只能覆盖(#゚Д゚) . 那么,为什么会这样゚Д゚) 在UITextField和UITextView中看起来像5个字符的单词,但在NSString中看起来像7个字符的单词 在这种情况下,如何获得字符串的正确长度 1)正如评论中所述,您的字符串由5个组合字符序列(或字符簇,如果您愿意的话)

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

  • 为什么?

  • 我正在使用
    修改
    UITextField
    UITextView
    中的文本。当我将uitextange设置为5个字符长度时,它只能覆盖(#゚Д゚) . 那么,为什么会这样゚Д゚) 在
    UITextField
    UITextView
    中看起来像5个字符的单词,但在NSString中看起来像7个字符的单词

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

  • 1)正如评论中所述,您的字符串由5个组合字符序列(或字符簇,如果您愿意的话)组成。当按
    unichar
    s分解为
    NSString
    length
    方法时,您将得到一个7,它是表示内存中字符串所需的
    unichar
    s数

    2)显然
    UITextField
    UITextView
    正在以unichar-savy的方式处理字符串。好消息,你也可以。参见#3

    3)您可以使用一些正确处理组合字符序列的
    NSString
    API来获得组合字符序列的数量。我很快就想到了一个小的
    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]);
    
    你会看到你得到了想要的结果


    有关
    NSString
    API的深入解释,请查看
    WWDC 2012年第215次会议视频“文本和语言分析”
    两者
    和<代码>Б゚
    由两个Unicode字符的组合表示(即使它们在视觉上显示为一个字符)。
    -[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));
        }
    }
    
    #导入
    NSString*DescribeUnicode字符(NSString*str)
    {
    NSMutableString*代码点=[NSMutableString];
    对于(整数i=0;i<[str length];++i){
    long ch=(long)[str characterAtIndex:i];
    [码点格式:@“%0.4lX”,ch];
    }
    返回码点;
    }
    int main(int argc,char*argv[]){
    @自动释放池{
    NSString*s=@”゚Д゚";
    NSLog(@“%ld个unicode字符.字节:%@),
    [s长度],描述单个或多个字符);
    }
    }
    
    输出为:
    4个unicode字符。字节:0020 FF9F 0414 FF9F


    2) 和3):NJones说了什么。

    猜测一下,我会说字符编码-NSString计算字节数和字符数吗?也许你的两个字符实际上是多字节字符,而NSString出错了…正如前面所说,这是一个猜测(#゚Д゚) 如果复制并粘贴到文本编辑器中,则有7个字符。对我来说,它“看起来”像一个6个字符的单词,因为末尾有一个空格。但是“Б”゚“实际上是两个unicode字符。